django的auth认证,is_authenticate 和装饰器的2个方法,注销的功能,

在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/")
时间: 2024-10-27 14:00:10

django的auth认证,is_authenticate 和装饰器的2个方法,注销的功能,的相关文章

Django视图函数函数之视图装饰器

FBV模式装饰器: 普通函数的装饰器(语法糖@) views.py 1 from django.shortcuts import render 2 3 def wrapper(f): 4 def inner(*args,**kwargs): 5 print("before") 6 ret=f(*args,**kwargs) 7 print("after") 8 return ret 9 return inner 10 11 @wrapper 12 def index

python 之用装饰器@property,把方法变成一个特性

# -*- coding: utf-8 -*- """ Created on Sun Nov 13 23:19:03 2016 @author: toby """ #知识点:用装饰器@property,把方法变成一个特性 class Province:     memo = 'One of China\'s 23 provinces' #静态字段          def __init__(self,name,capital,leadership

django的权限认证:登录和退出。auth模块和@login_required装饰器

在settings.py中配置LOGIN_URL参数: # 用户访问带有(@login_required)标签的页面(view)时,如果没有登录,就会跳转到LOGIN_URL(即登陆url). LOGIN_URL = '/login/' 使用django自带的auth模块进行登录和退出: from django.contrib.auth.models import User from django.contrib import auth from django.http.response imp

Django内置auth模块中login_required装饰器用于类视图的优雅方式

使用多继承 以及类似java中的静态代理模式 原理:OrderView.as_view()根据广度优先,调用的是LoginRequiredMixin中的as_view(cls, *args, **kwargs) 这时的cls=OrderView 接下来super(LoginRequiredMixin, cls).as_view(*args, **kwargs) 会调用到View类中的as_view()并返回一个视图函数 然后,用将这个视图函数作为参数传给Login_required()并返回经过

Django进阶-Auth认证模块

转自:https://www.cnblogs.com/liwenzhou/p/9030211.html Django自带的用户认证系统 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Django作为一个完美主义者的终极框架,当然也会想到用户的这些痛点.它内置了强大的用户认证系统--auth,它默认使用 auth_user 表来存储用户数据. auth模块 authenticate(

Django之auth认证组件

原文链接:https://www.jianshu.com/p/612b3d76a1f5 Django之auth组件 前言:我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统. 此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Django作为一个完美主义者的终极框架,当然也会想到用户的这些痛点.它内置了强大的用户认证系统--auth,它默认使用 auth_user 表来存储用户数据. auth中提供的实用方法: - 创建用户 pytho

Django之Auth认证

命令行创建超级用户 python manage.py createsuperuser 登陆验证跳转 # 局部配置 # @login_required(login_url='/auth_login/') # 全局配置 # auth自动跳转 LOGIN_URL = '/auth_login/' # settings.py配置 可以扩展默认的用户model from django.contrib.auth.models import AbstractUser class Userinfo(Abstra

对Python装饰器的个人理解方法

0.说明 在自己好好总结并对Python装饰器的执行过程进行分解之前,对于装饰器虽然理解它的基本工作方式,但对于存在复杂参数的装饰器(装饰器和函数本身都有参数),总是会感到很模糊,即使这会弄懂了,下一次也很快忘记,其实本质上还是没有多花时间去搞懂其中的细节问题. 虽然网络上已经有很多这样的文章,但显然都是别人的思想,因此自己总是记不牢,所以花点时间自己好好整理一下. 最近在对<Python核心编程>做总结,收获了不少,下面分享一下我自己对于Python装饰器的理解,后面还提供了一个较为复杂的P

实现一个Porperty装饰器,可以把方法装饰成同一个属性名

今天简单的实现下Porperty装饰器demo: class Porperty: def __init__(self, fget= None, fset= None, fdel = None): self.fget= fget self.fset = fset self.fdel = fdel def __get__(self, instance, cls): if instance is None: return self if not callable(self.fget): raise A