django的auth认证,authenticate和装饰器功能详解


Posted in Python onJuly 25, 2019

在django中创建表,会自动创建一些django自带的表,先了解用户认证,

django的auth认证,authenticate和装饰器功能详解

认证登录 先要引用 ,

from django.contrib import auth

有很多方法,

网站先有登录和认证,

authenticate(),提供用户认证,验证用户名和密码是否正确,一般需要username ,password两个关键字参数,

认证信息有效,返回有一个User对象。authrenticate()会在User对象上设置一个属性标识,认证了该用户,

创建一个Book表,然后生成数据库

from django.db import models

# Create your models here.


class Book(models.Model):

  title = models.CharField(max_length=32)
  price = models.DecimalField(max_digits=5,decimal_places=2)

在pycharm里命令台terminal 里创建一个超级用户 root, 密码 root123456

C:\Users\lenovo\PycharmProjects\auth_gu>python manage.py createsuperuser
Username (leave blank to use 'lenovo'): root
Email address:
Password:
Password (again):
This password is too short. It must contain at least 8 characters.
Password:
Password (again):
Superuser created successfully.

然后在auth_user 表中就有了刚才创建的信息

django的auth认证,authenticate和装饰器功能详解

可以看到django是做了一层加密,

创建login页面,

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>

</head>
<body>

<form action="/login/" method="post">

{#  #} {% csrf_token %}
  <p>姓名:<input type="text" name="user"></p>
  <p>密码:<input type="password" name="pwd"></p>
  <input type="submit" value="提交">

</form>

</body>

</html>

当我提交的时候,会出现forbidden的情况,get请求不会出现这种情况,

因为在setting文件的中间件,不允许出现跨站请求,

别的网站第一次访问我就发送post 请求,我的网站就拒绝,怎么拒绝,要区分第一次和第二次,y用cookie, 在cookie里加上csrf-token,下次请求时,cookie就有csrf-token ,就知道,已经登录过了,不会再被forbidden掉了,

在form表单中添加 {% csrf_token %},

在前端页面,检查元素,就可以看到有了crsf-token ,是隐藏的状态,

django的auth认证,authenticate和装饰器功能详解

------

在ajax请求的时候,也要加上csrf-token,

$.ajax({

data:{csrfmiddlewaretoken:'{{csrf-token}}' },

}),

-----

在views文件,使用authenticate()方法,从前端获取用户登录的信息进行验证,

def login(request):

  if request.method == "POST":

    user = request.POST.get("user")
    pwd = request.POST.get("pwd")
    #使用authenticate()方法
    auth.authenticate(username=user,password=pwd)
    print("user",user)
    print("pwd",pwd)

    return HttpResponse("ok")


  return render(request,"login.html")

在前端页面,输入刚才注册的超级用户,和密码,登录成功,后台进行打印出用户名和密码,

user root
pwd root123456
[05/Dec/2017 10:04:41] "POST /login/ HTTP/1.1" 200 2

但现在存在一个问题,没有cookie和session,如果换个浏览器,登录index页面,还是能直接直接登录,

所以现在就可以直接用,login(request,User),就相当于设置了cookie和session, 在跳转到index页面亲,跳转

修改login函数,因为与django里login()重名了,

def index(request):


  return render(request,'index.html')

#用django的认证方法,
def log_in(request):

  if request.method == "POST":

    user = request.POST.get("user")
    pwd = request.POST.get("pwd")
    #使用authenticate()方法
    auth.authenticate(username=user,password=pwd)
    print("user",user)
    print("pwd",pwd)

    if user is not None:#如果有这个用户,跳转到index页面

      auth.login(request,user)    -------------------

      return redirect("/index/")

  return render(request,"log_in.html")

关于装饰器login_required 和is_authenticated ()的功能一样,就是不用判断了

from django.shortcuts import render,HttpResponse,redirect

from django.contrib.auth.decorators import login_required
#与is_authenticate的工程一样,

# Create your views here.

from django.contrib import auth
#auth 的3个方法,
#authenticate()
#login(HttpResquest,user)
#logout(request)



# @login_required,与is_authenticate 的功能一样,就不用判断,

#举例说明
@login_required
def index2(request):
  # 可以加一个装饰器,与is_authenticated()的功能一样,@login_required
  # 先导入 from django.contrib.auth.decorators import login_required
  return render(request,"index.html")

#如果用户没有登录,者跳转到django默认的登录URL"accounts/login/" ,可以以
#通过settings文件通过LOGIN_URL进行修改,并传递当前访问的url的绝对路径

def index(request):
  #打印一个user对象,利用user对象的is_tuthenticated方法做判断,是否验证过,返回布尔值,,做判断
  #用户登录后才能访问某些页面,
  #没有登录就访问,就直接跳到登录页面,
  #用户跳转到登录页面完成登录,自动访问跳转到之前访问的地址,
  print("=====>",request.user.is_authenticated())
  #=====> root
  # ,如果换个浏览器,就是AnonymousUser匿名,

  if request.user.is_authenticated():#已登录

    return render(request,"index.html")
  else:
    return redirect("/log_in/")

  #登录之前先验证,

  return render(request,'index.html')



#用django的认证方法,
def log_in(request):

  if request.method == "POST":

    user = request.POST.get("user")
    pwd = request.POST.get("pwd")
    #使用authenticate()方法,得到一个User对象,做user验证,
    user = auth.authenticate(username=user,password=pwd)
    print("user",user)
    print("pwd",pwd)

    if user is not None:#如果有这个用户,跳转到index页面

      auth.login(request,user)#auth下的login() 方法,就相当于session+cookie,在跳转到index页面还要实现做判断,

      return redirect("/index/")

  return render(request,"log_in.html")

-------------------------------

现在写一个注册功能,url路由

from django.conf.urls import url
from django.contrib import admin

from app01 import views

urlpatterns = [
  url(r'^admin/', admin.site.urls),
  url(r'^log_in/', views.log_in),
  url(r'^index/', views.index),
  url(r'^reg/', views.reg),
  url(r'^log_out/', views.log_out),
]

再写一个reg页面

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>

</head>
<body>

<h1>注册页面</h1>

<h4>{{ error_message }}</h4>

<form action="/reg/" method="post">
  
  {% csrf_token %}
  <p>姓名:<input type="text" name="user"></p>
  <p>密码:<input type="password" name="pwd"></p>
  <p>确认密码:<input type="password" name="repeat_pwd"></p>
  <input type="submit">
</form>



</body>

</html>

在views 视图函数中,

#注册页面
def reg(request):

  error_message = ""#放在全局
  if request.method=="POST":
    #获取用户输入的数据,存到数据库前,要先判断
    user = request.POST.get("user")
    pwd = request.POST.get("pwd")
    repeat_pwd = request.POST.get("repeat_pwd")


    #密码不能为空,
    if not pwd or not repeat_pwd :
      error_message="密码不能为空"

    elif not user :
      error_message="用户名不能为空"

    elif repeat_pwd != pwd:
      error_message = "密码不一致"
    elif User.objects.filter(username = user):

      error_message = "用户已存在"

    else:
      #把用户输入的用户名和密码存到数据库,但django做了一次加密,
  #所以就不能直接用,create的方法,要用User表的方法,create_user()
      User.objects.create_user(username = user,password = pwd)

      #注册成功后,跳到登录页面
      return redirect("/log_in/")


  return render(request,"reg.html",{"error_message":error_message})

auth下的注销功能,直接挑用logout()方法,

#注销功能,清除掉cookie和session,
def log_out(request):
  #登录的时候,用到了login()函数,

  auth.logout(request)#清除了cookie和session,清除了当前的用户,

  return redirect("/log_in/")

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python操作摄像头截图实现远程监控的例子
Mar 25 Python
编写简单的Python程序来判断文本的语种
Apr 07 Python
分享Python字符串关键点
Dec 13 Python
详解tensorflow训练自己的数据集实现CNN图像分类
Feb 07 Python
Django 对IP访问频率进行限制的例子
Aug 30 Python
python文件读写代码实例
Oct 21 Python
django迁移文件migrations的实现
Mar 31 Python
解决jupyter notebook 前面书写后面内容消失的问题
Apr 13 Python
python 画条形图(柱状图)实例
Apr 24 Python
python如何控制进程或者线程的个数
Oct 16 Python
自动在Windows中运行Python脚本并定时触发功能实现
Sep 04 Python
Python MNIST手写体识别详解与试练
Nov 07 Python
使用python telnetlib批量备份交换机配置的方法
Jul 25 #Python
python找出因数与质因数的方法
Jul 25 #Python
HTML的form表单和django的form表单
Jul 25 #Python
Python3 批量扫描端口的例子
Jul 25 #Python
python3 批量获取对应端口服务的实例
Jul 25 #Python
Python实现微信小程序支付功能
Jul 25 #Python
Form表单及django的form表单的补充
Jul 25 #Python
You might like
php中文件上传的安全问题
2006/10/09 PHP
str_replace只替换一次字符串的方法
2013/04/09 PHP
PHP实现的微信APP支付功能示例【基于TP5框架】
2019/09/16 PHP
javascript实现存储hmtl字符串示例
2014/04/25 Javascript
jQuery实现垂直半透明手风琴特效代码分享
2015/08/21 Javascript
JS+CSS实现的日本门户网站经典选项卡导航效果
2015/09/27 Javascript
JS代码实现根据时间变换页面背景效果
2016/06/16 Javascript
基于js实现二级下拉联动
2016/12/17 Javascript
Vue.js系列之项目结构说明(2)
2017/01/03 Javascript
JS字典Dictionary类定义与用法示例
2019/02/01 Javascript
vue cli3.0结合echarts3.0与地图的使用方法示例
2019/03/26 Javascript
微信小程序传值以及获取值方法的详解
2019/04/29 Javascript
微信小程序如何调用json数据接口并解析
2019/06/29 Javascript
js实现AI五子棋人机大战
2020/05/28 Javascript
Vue学习之常用指令实例详解
2020/01/06 Javascript
javascript实现简单搜索功能
2020/03/26 Javascript
python发送邮件接收邮件示例分享
2014/01/21 Python
Python中unittest用法实例
2014/09/25 Python
Python的Django框架中的数据库配置指南
2015/07/17 Python
深入理解Python分布式爬虫原理
2017/11/23 Python
wxPython的安装图文教程(Windows)
2017/12/28 Python
Python中的类与类型示例详解
2019/07/10 Python
利用PyQt中的QThread类实现多线程
2020/02/18 Python
Python 找出出现次数超过数组长度一半的元素实例
2020/05/11 Python
使用SQLAlchemy操作数据库表过程解析
2020/06/10 Python
python+selenium 简易地疫情信息自动打卡签到功能的实现代码
2020/08/22 Python
python 用opencv实现图像修复和图像金字塔
2020/11/27 Python
一套软件测试笔试题
2014/07/25 面试题
高职助产应届生自荐信
2013/09/24 职场文书
舞蹈教育学专业推荐信
2013/11/27 职场文书
高级方案规划工程师岗位职责
2013/11/29 职场文书
致铅球运动员加油稿
2014/02/13 职场文书
高中家长寄语
2014/04/02 职场文书
2014年保险业务员工作总结
2014/12/23 职场文书
毕业实习计划书
2015/01/16 职场文书
Python实现灰色关联分析与结果可视化的详细代码
2022/03/25 Python