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判断文件和字符串编码类型的实例
Dec 21 Python
Python爬虫通过替换http request header来欺骗浏览器实现登录功能
Jan 07 Python
python删除过期log文件操作实例解析
Jan 31 Python
Python实现提取XML内容并保存到Excel中的方法
Sep 01 Python
程序员写Python时的5个坏习惯,你有几条?
Nov 26 Python
详解Python 切片语法
Jun 10 Python
Python随机函数库random的使用方法详解
Aug 21 Python
Python基于模块Paramiko实现SSHv2协议
Apr 28 Python
Python使用re模块验证危险字符
May 21 Python
Python 如何定义匿名或内联函数
Aug 01 Python
python raise的基本使用
Sep 10 Python
基于pycharm 项目和项目文件命名规则的介绍
Jan 15 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
Oracle 常见问题解答
2006/10/09 PHP
PHP CKEditor 上传图片实现代码
2009/11/06 PHP
ubuntu10.04配置 nginx+php-fpm模式的详解
2013/06/03 PHP
浅析php工厂模式
2014/11/25 PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
2017/06/13 PHP
用PHP的反射实现委托模式的讲解
2019/03/22 PHP
Laravel5.5 视图 - 创建视图和数据传递示例
2019/10/21 PHP
你所要知道JS(DHTML)中的一些技巧
2007/01/09 Javascript
javascript 系统文件夹文件操作及参数介绍
2013/01/08 Javascript
推荐6款基于jQuery实现图片效果插件
2014/12/07 Javascript
纯js代码制作的网页时钟特效【附实例】
2016/03/30 Javascript
JavaScript编写带旋转+线条干扰的验证码脚本实例
2016/05/30 Javascript
jQuery版AJAX简易封装代码
2016/09/14 Javascript
脚本div实现拖放功能(两种)
2017/02/13 Javascript
layui文件上传实现代码
2017/05/20 Javascript
angularjs数组判断是否含有某个元素的实例
2018/02/27 Javascript
Vue源码解析之数组变异的实现
2018/12/04 Javascript
webpack的tree shaking的实现方法
2019/09/18 Javascript
layUI的验证码功能及校验实例
2019/10/25 Javascript
vue如何使用外部特殊字体的操作
2020/07/30 Javascript
Python求解任意闭区间的所有素数
2018/06/10 Python
python random从集合中随机选择元素的方法
2019/01/23 Python
利用matplotlib实现根据实时数据动态更新图形
2019/12/13 Python
python实现滑雪游戏
2020/02/22 Python
500行python代码实现飞机大战
2020/04/24 Python
浅谈Python中的生成器和迭代器
2020/06/19 Python
基于Python下载网络图片方法汇总代码实例
2020/06/24 Python
利用CSS3实现平移动画效果示例代码
2016/10/12 HTML / CSS
HTML5拖拽的简单实例
2016/05/30 HTML / CSS
存储过程的优缺点是什么
2015/01/10 面试题
幼儿教师个人求职信范文
2013/09/21 职场文书
函授毕业生自我鉴定范文
2014/03/25 职场文书
走进敬老院活动总结
2014/07/10 职场文书
机器人总动员观后感
2015/06/09 职场文书
vue前端工程的搭建
2021/03/31 Vue.js
JS轻量级函数式编程实现XDM二
2022/06/16 Javascript