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中的应用之translate和maketrans用法详解
Aug 27 Python
多个应用共存的Django配置方法
May 30 Python
python3.5安装python3-tk详解
Apr 26 Python
Django框架创建项目的方法入门教程
Nov 04 Python
Django3.0 异步通信初体验(小结)
Dec 04 Python
python将图片转base64,实现前端显示
Jan 09 Python
pytorch中 gpu与gpu、gpu与cpu 在load时相互转化操作
May 25 Python
如何在mac下配置python虚拟环境
Jul 06 Python
Python如何输出百分比
Jul 31 Python
python Matplotlib数据可视化(1):简单入门
Sep 30 Python
Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版)
Feb 22 Python
详解Python+OpenCV进行基础的图像操作
Feb 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
基于文本的访客签到簿
2006/10/09 PHP
php快速url重写 更新版[需php 5.30以上]
2010/04/20 PHP
php将fileterms函数返回的结果变成可读的形式
2011/04/21 PHP
基于PHP遍历数组的方法汇总分析
2013/06/08 PHP
php arsort 数组降序排序详细介绍
2016/11/17 PHP
jquery中dom操作和事件的实例学习 下拉框应用
2011/12/01 Javascript
基于dom编程中 动态创建与删除元素的使用
2013/04/17 Javascript
jQuery实现非常实用漂亮的select下拉菜单选择效果
2015/11/06 Javascript
正则表达式基本语法及表单验证操作详解【基于JS】
2017/04/07 Javascript
nodejs入门教程二:创建一个简单应用示例
2017/04/24 NodeJs
Vue批量图片显示时遇到的路径被解析问题
2019/03/28 Javascript
详解node登录接口之密码错误限制次数(含代码)
2019/10/25 Javascript
[42:00]完美世界DOTA2联赛PWL S3 Phoenix vs INK ICE 第一场 12.13
2020/12/17 DOTA
Tornado服务器中绑定域名、虚拟主机的方法
2014/08/22 Python
Python处理RSS、ATOM模块FEEDPARSER介绍
2015/02/18 Python
python装饰器初探(推荐)
2016/07/21 Python
python爬取个性签名的方法
2018/06/17 Python
python网络应用开发知识点浅析
2019/05/28 Python
python 实现返回一个列表中出现次数最多的元素方法
2019/06/11 Python
python中selenium操作下拉滚动条的几种方法汇总
2019/07/14 Python
TensorFlow打印输出tensor的值
2020/04/19 Python
Python 解析库json及jsonpath pickle的实现
2020/08/17 Python
python使用scapy模块实现ping扫描的过程详解
2021/01/21 Python
python openpyxl模块的使用详解
2021/02/25 Python
基于Modernizr 让网站进行优雅降级的分析
2013/04/21 HTML / CSS
EntityManager都有哪些方法
2013/11/01 面试题
高级人员简历的自我评价分享
2013/11/03 职场文书
外贸业务员岗位职责
2013/11/24 职场文书
致跳远运动员加油稿
2014/02/11 职场文书
《两个铁球同时着地》教学反思
2014/02/13 职场文书
个人考核材料
2014/05/15 职场文书
企业优秀员工事迹材料
2014/05/28 职场文书
党员教师个人对照检查材料范文
2014/09/25 职场文书
position:sticky 粘性定位的几种巧妙应用详解
2021/04/24 HTML / CSS
教你用Python matplotlib库制作简单的动画
2021/06/11 Python
MyBatis自定义SQL拦截器示例详解
2021/10/24 Java/Android