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函数式编程指南(一):函数式编程概述
Jun 24 Python
详解Golang 与python中的字符串反转
Jul 21 Python
python http接口自动化脚本详解
Jan 02 Python
TensorFlow 模型载入方法汇总(小结)
Jun 19 Python
python计算列表内各元素的个数实例
Jun 29 Python
python3.x实现base64加密和解密
Mar 28 Python
深入解析神经网络从原理到实现
Jul 26 Python
Python 读取 YUV(NV12) 视频文件实例
Dec 09 Python
tensorflow 动态获取 BatchSzie 的大小实例
Jun 30 Python
pycharm中如何自定义设置通过“ctrl+滚轮”进行放大和缩小实现方法
Sep 16 Python
Matplotlib配色之Colormap详解
Jan 05 Python
Python爬取用户观影数据并分析用户与电影之间的隐藏信息!
Jun 29 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
javascript自动改变文字大小和颜色的效果的小例子
2013/08/02 Javascript
使用javascript实现页面定时跳转总结篇
2013/09/21 Javascript
extjs每个组件要设置唯一的ID否则会出错
2014/06/15 Javascript
jQuery中fadeOut()方法用法实例
2014/12/24 Javascript
jQuery获取标签文本内容和html内容的方法
2015/03/27 Javascript
异步安全加载javascript文件的方法
2015/07/21 Javascript
javascript跨域的方法汇总
2015/10/23 Javascript
JS基于面向对象实现的选项卡效果示例
2016/12/20 Javascript
如何使用Bootstrap 按钮实例详解
2017/03/29 Javascript
JS开发中百度地图+城市联动实现实时触发查询地址功能
2017/04/13 Javascript
AngularJS动态菜单操作指令
2017/04/25 Javascript
js仿微信抢红包功能
2020/09/25 Javascript
vue-cli4.x创建企业级项目的方法步骤
2020/06/18 Javascript
vue项目实现多语言切换的思路
2020/09/17 Javascript
基于JS实现操作成功之后自动跳转页面
2020/09/25 Javascript
vue实现选中效果
2020/10/07 Javascript
[03:05]DOTA2英雄基础教程 嗜血狂魔
2013/12/10 DOTA
python实现调用其他python脚本的方法
2014/10/05 Python
利用Python中的输入和输出功能进行读取和写入的教程
2015/04/14 Python
Python记录详细调用堆栈日志的方法
2015/05/05 Python
python中有帮助函数吗
2020/06/19 Python
新西兰Bookabach:查找全球度假屋
2020/12/03 全球购物
NHL官方在线商店:Shop.NHL.com
2020/05/01 全球购物
费用会计岗位职责
2014/01/01 职场文书
平民服装店创业计划书
2014/01/17 职场文书
学习标兵获奖感言
2014/02/20 职场文书
担保书格式及范文
2014/04/01 职场文书
《晚上的太阳》教学反思
2014/04/23 职场文书
安全教育月活动总结
2014/05/05 职场文书
考试作弊检讨书1000字(5篇)
2014/10/19 职场文书
领导干部群众路线对照检查材料
2014/11/05 职场文书
教师年度个人总结
2015/02/11 职场文书
2015年乡镇财政工作总结
2015/05/19 职场文书
热血教师观后感
2015/06/10 职场文书
《走遍天下书为侣》教学反思
2016/02/22 职场文书
Python关于OS文件目录处理的实例分享
2021/05/23 Python