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之从格式化表达式到方法
Sep 28 Python
线程和进程的区别及Python代码实例
Feb 04 Python
python数据类型_字符串常用操作(详解)
May 30 Python
python如何实现int函数的方法示例
Feb 19 Python
python找出完数的方法
Nov 12 Python
对python PLT中的image和skimage处理图片方法详解
Jan 10 Python
基于Numpy.convolve使用Python实现滑动平均滤波的思路详解
May 16 Python
python3实现微型的web服务器
Sep 03 Python
Python提取PDF内容的方法(文本、图像、线条等)
Sep 25 Python
Python内置方法实现字符串的秘钥加解密(推荐)
Dec 09 Python
基于python纯函数实现井字棋游戏
May 27 Python
keras中的History对象用法
Jun 19 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
跟随鼠标旋转的文字
2006/11/30 Javascript
JavaScript 联动的无限级封装类,数据采用非Ajax方式,随意添加联动
2010/06/29 Javascript
js将控件隐藏及display属性的使用介绍
2013/12/30 Javascript
JavaScript中document.forms[0]与getElementByName区别
2015/01/21 Javascript
基于javascript如何传递特殊字符
2015/11/30 Javascript
第三篇Bootstrap网格基础
2016/06/21 Javascript
JavaScript实现反转字符串的方法详解
2017/04/27 Javascript
vue全局使用axios的方法实例详解
2018/11/22 Javascript
Vue监听页面刷新和关闭功能
2019/06/20 Javascript
利用React高阶组件实现一个面包屑导航的示例
2020/08/23 Javascript
[01:22:19]EG vs TNC Supermajor小组赛B组败者组第一轮 BO3 第二场 6.2
2018/06/03 DOTA
Python操作Mysql实例代码教程在线版(查询手册)
2013/02/18 Python
python3访问sina首页中文的处理方法
2014/02/24 Python
星球大战与Python之间的那些事
2016/01/07 Python
Python实现的字典排序操作示例【按键名key与键值value排序】
2018/12/21 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
2019/01/22 Python
pandas dataframe添加表格框线输出的方法
2019/02/08 Python
python实现多线程端口扫描
2019/08/31 Python
tensorflow安装成功import tensorflow 出现问题
2020/04/16 Python
Tensorflow使用Anaconda、pycharm安装记录
2020/07/29 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
2021/03/03 Python
html5跨域通讯之postMessage的用法总结
2013/11/07 HTML / CSS
Html5导航栏吸顶方案原理与对比实现
2020/06/10 HTML / CSS
Ado与Ado.net的相同与不同
2014/12/08 面试题
党员自我批评与反省材料
2014/02/10 职场文书
大学应届生的自我评价
2014/03/06 职场文书
秋季开学典礼主持词
2014/03/19 职场文书
超越自我演讲稿
2014/05/21 职场文书
电子专业求职信
2014/06/19 职场文书
2014年扶贫工作总结
2014/11/18 职场文书
优秀班主任先进事迹材料
2014/12/16 职场文书
体检通知范文
2015/04/21 职场文书
百年孤独读书笔记
2015/06/29 职场文书
战友聚会致辞
2015/07/28 职场文书
小学数学国培研修日志
2015/11/13 职场文书
SpringBoot整合Minio文件存储
2022/04/03 Java/Android