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

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

认证登录 先要引用 ,

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是做了一层加密,

创建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 ,是隐藏的状态,

------

在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/")

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

(0)

相关推荐

  • 详解Django之auth模块(用户认证)

    auth模块简介 auth模块是对登录认证方法的一种封装,之前我们获取用户输入的用户名及密码后需要自己从user表里查询有没有用户名和密码符合的对象, 而有了auth模块之后就可以很轻松的去验证用户的登录信息是否存在于数据库中. 除此之外,auth还对session做了一些封装,方便我们校验用户是否已登录 auth里的方法 如果想使用auth模块的方法,必须要先导入auth模块 from django.contrib import auth django.contrib.auth中提供了许多方法

  • 详解Django中六个常用的自定义装饰器

    装饰器作用 decorator是当今最流行的设计模式之一,很多使用它的人并不知道它是一种设计模式.这种模式有什么特别之处? 有兴趣可以看看Python Wiki上例子,使用它可以很方便地修改对象行为,通过使用类似例中的接口将修改动作封装在装饰对象中. decorator 可以动态地修改函数.方法或类的功能,而无需创建子类或修改类的源代码.正因为如此,装饰器可以让代码将变得更干净.更可读.更可维护(这很重要!),并且减少了许多冗余但又不得不写的代码,使我们可以使用单个方法向多个类添加功能. 对于装

  • 详解Django-auth-ldap 配置方法

    使用场景 公司内部使用Django作为后端服务框架的Web服务,当需要使用公司内部搭建的Ldap 或者 Windows 的AD服务器作为Web登录认证系统时,就需要这个Django-auth-ldap第三方插件 插件介绍 Django-auth-ldap是一个Django身份验证后端,可以针对LDAP服务进行身份验证.有许多丰富的配置选项可用于处理用户,组和权限,便于对页面和后台的控制 插件介绍地址:Django-auth-ldap 安装方法 注意:需先正确安装python3环境.pip3 和

  • 使用Python装饰器在Django框架下去除冗余代码的教程

    Python装饰器是一个消除冗余的强大工具.随着将功能模块化为大小合适的方法,即使是最复杂的工作流,装饰器也能使它变成简洁的功能. 例如让我们看看Django web框架,该框架处理请求的方法接收一个方法对象,返回一个响应对象: def handle_request(request): return HttpResponse("Hello, World") 我最近遇到一个案例,需要编写几个满足下述条件的api方法: 返回json响应 如果是GET请求,那么返回错误码 做为一个注册api

  • django如何通过类视图使用装饰器

    需求:当我们想禁止ip黑名单访问我们的某些页面时,例如注册页面.应该怎么操作呢? 解决方案:这时候我们可以设计一个装饰器,过滤ip黑名单. 装饰器的写法如下: from functools import wraps def ban_ip(func): @wraps(func) def wrapper(request,*args,**kwargs): IP = request.META.get("REMOTE_ADDR") if IP in ["127.0.0.1"]

  • Django中login_required装饰器的深入介绍

    前言 Django提供了多种装饰器, 其中login_required可能是经常会使用到的. 这里介绍下四种使用此装饰器的办法. 当然, 在使用前, 记得在工程目录的settings.py中设置好LOGIN_URL 使用方法 1. URLconf中装饰 from django.contrib.auth.decorators import login_required, permission_required from django.views.generic import TemplateVie

  • DJANGO-ALLAUTH社交用户系统的安装配置

    DJANGO-ALLAUTH是github上面排名较高的django user系统.本来通过对比是想选用django-userea的,可是博主智商不够看懂它的安装配置文档.....搞乱了一个测试项目之后,只好作罢.好在allauth安装配置相对简单.但是它的文档写得更乱...很多关键信息居然是在常见问题里面找到...记录下来备忘. 1.安装: 复制代码 代码如下: pip install django-allauth 2.配置 settings.py 复制代码 代码如下: TEMPLATE_CO

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

    在django中创建表,会自动创建一些django自带的表,先了解用户认证, 认证登录 先要引用 , from django.contrib import auth 有很多方法, 网站先有登录和认证, authenticate(),提供用户认证,验证用户名和密码是否正确,一般需要username ,password两个关键字参数, 认证信息有效,返回有一个User对象.authrenticate()会在User对象上设置一个属性标识,认证了该用户, 创建一个Book表,然后生成数据库 from

  • python中函数总结之装饰器闭包详解

    1.前言 函数也是一个对象,从而可以增加属性,使用句点来表示属性. 如果内部函数的定义包含了在外部函数中定义的对象的引用(外部对象可以是在外部函数之外),那么内部函数被称之为闭包. 2.装饰器 装饰器就是包装原来的函数,从而在不需要修改原来代码的基础之上,可以做更多的事情. 装饰器语法如下: @deco2 @deco1 def func(arg1,arg2...): pass 这个表示了有两个装饰器的函数,那么表示的含义为:func = deco2(deco1(func)) 无参装饰器语法如下:

  • Python 中闭包与装饰器案例详解

    项目github地址:bitcarmanlee easy-algorithm-interview-and-practice 1.Python中一切皆对象 这恐怕是学习Python最有用的一句话.想必你已经知道Python中的list, tuple, dict等内置数据结构,当你执行: alist = [1, 2, 3] 时,你就创建了一个列表对象,并且用alist这个变量引用它: 当然你也可以自己定义一个类: class House(object): def __init__(self, are

  • Python中的装饰器用法详解

    本文实例讲述了Python中的装饰器用法.分享给大家供大家参考.具体分析如下: 这里还是先由stackoverflow上面的一个问题引起吧,如果使用如下的代码: 复制代码 代码如下: @makebold @makeitalic def say():    return "Hello" 打印出如下的输出: <b><i>Hello<i></b> 你会怎么做?最后给出的答案是: 复制代码 代码如下: def makebold(fn):    

  • Python装饰器基础详解

    装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法或者类进行加工.在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象作为某一个函数的返回结果.相对于其它方式,装饰器语法简单,代码可读性高.因此,装饰器在Python项目中有广泛的应用. 前面快速介绍了装饰器的语法,在这里,我们将深入装饰器内部工作机制,更详细更系统地介绍装饰器的内容,并学习自己编写新的装饰器的更多高级语法. 什么是装饰器 装饰是为函数和类指定管理代码的一种

  • Python的装饰器使用详解

    Python有大量强大又贴心的特性,如果要列个最受欢迎排行榜,那么装饰器绝对会在其中. 初识装饰器,会感觉到优雅且神奇,想亲手实现时却总有距离感,就像深闺的冰美人一般.这往往是因为理解装饰器时把其他的一些概念混杂在一起了.待我抚去层层面纱,你会看到纯粹的装饰器其实蛮简单直率的. 装饰器的原理 在解释器下跑个装饰器的例子,直观地感受一下. # make_bold就是装饰器,实现方式这里略去 >>> @make_bold ... def get_content(): ... return '

  • Python 装饰器使用详解

    装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象. 经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓存.权限校验等场景.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用. 先来看一个简单例子: def now(): print('2017_7_29') 现在有一个新的需求,希望可以记录下函数的执行日志,于是在代码中添加日志代码: def now():

  • python 自定义装饰器实例详解

    本文实例讲述了python 自定义装饰器.分享给大家供大家参考,具体如下: 先看一个例子 def deco(func): print("before myfunc() called.") func() print("after myfunc() called.") return func @deco def myfunc(): print("myfunc() called.") # myfunc = deco(myfunc) # 与上面的@dec

  • Python高级特性之闭包与装饰器实例详解

    本文实例讲述了Python高级特性之闭包与装饰器.分享给大家供大家参考,具体如下: 闭包 1.函数参数: (1)函数名存放的是函数的地址 (2)函数名()存放的是函数内的代码 (3)函数名只是函数代码空间的引用,当函数名赋值给一个对象的时候,就是引用传递 def func01(): print("func01 is show") test = func01 print(func01) print(test) test() 结果: 2.闭包: (1)内层函数可以访问外层函数变量 (2)闭

  • Python装饰器代码详解

    目录 一.理解装饰器 二.装饰器原型 1.不带参数的装饰器 2.带参数的被装饰的函数 3.带参数的装饰器 4.使用类作为装饰器 5.使用对象作为装饰器 6.多层装饰器的嵌套 总结 一.理解装饰器 所有东西都是对象(函数可以当做对象传递) 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. def function_one(): print("测试函数") #可以将一个函数赋值给一个变量,比如 foo =function_one #这里没有在使用小括号,因

随机推荐