zoukankan      html  css  js  c++  java
  • Auth模块使用方法大全

    auth认证

    导包

    from django.contrib import auth
    

    默认数据库中使用auth_user表

    创建超级用户

    python manage.py createsuperuser
    

    验证登陆

    auth.authenticate(request,username,password)
    

    校验用户密码和账号,通过返回具体的用户对象

    添加session,标识已登陆

    auth.login(request,user)
    

    接受request和前面通过登陆验证的user对象,将session key保存在浏览器,数据保存在django_session表中。

    登陆验证装饰器

    用来装饰需要登陆后给浏览器添加session后才能访问的视图添加检测,如果有session则放行,否则跳转指定页面,通常我们设置成登陆页面。

    #导入auth 登陆装饰器
    from django.contrib.auth.decorators import login_required
    
    #在需要登陆后才能访问的页面视图前面添加装饰器
    @login_required
    def index():
        pass
    

    这样浏览器在访问index页面时,会先检查是否有session,如果没有,则跳转默认页面,并将原访问页面作为get参数放在跳转页面中,在登陆成功后会跳转之前要访问的页面

    http://127.0.0.1:8000/accounts/login/?next=/index/
    # 例如我要访问index页面,但是我没session,
    # 这时装饰器会默认跳转到/accounts/login/页面,
    # 并将index页面的url以next参数的形式包含在其中
    #,这样在你登陆后,还能返回原页面
    

    可以在django的settings中修改装饰器默认跳转的Url

    #配置auth认证登陆装饰器的默认跳转地址
    LOGIN_URL = '/login/'
    

    注销方法

    auth.logout(request)
    

    接受一个request,清除当前request中的session并在数据表中django_session数据也会被清除。
    常用方法,搭配一个视图使用:

    def logout(request):
        auth.logout(request)
        return redirect('/login/')
    
    

    例如在页面上使用a标签和button按钮点击跳转注销视图,注销后跳回登陆页面

    request.user属性

    auth组件的中间间中做了这样一个事情,当request请求来时,判断是否有session,如果有session则会根据session去django_session中找出相应的用户的信息,并赋值给request.user属性,也就是request.user=user是一个User数据对象,否则返回一个匿名的对象给request.user,该对象调用所有的方法都返回None

    def index(request):
        print(request.user)
    # 是一个懒加载数据对象
    

    这时我们可以把request.user当作一个普通的orm中的数据对象

    is_authenticated

    判断用户对象是否通过了校验

    request.user.is_authenticated
    # 返回一个布尔值
    

    实例

    from django.shortcuts import render,HttpResponse,redirect
    from django.contrib import auth
    from django.contrib.auth.decorators import login_required
    # Create your views here.
    
    def login(request):
        if request.method=='POST':
            username = request.POST.get('username')
            pwd = request.POST.get('password')
            print(username,pwd)
            #利用auth验证用户名和密码是否正确验证成功实例化一个数据对象否则返回none
            user = auth.authenticate(request,username=username,password=pwd)
            if user:
                #登录成功后,给登录用户在request中增加session,存在数据库
                auth.login(request,user)
                return redirect('/index/')
            else:
                msg = '错误'
                print('用户名错误')
                return redirect('/index/')
    
        return render(request,'login.html')
    
    
    def logout(request):
        auth.logout(request)
        return redirect('/login/')
    @login_required()
    def index(request):
        print(request.session.__dir__)
        print(request.user.password)
        return render(request,'Index.html')
    

    auth中user表的使用

    因为auth中的用户表存的密码是密文形式,所以不能直接使用orm中creat语句

    #导入user表
    from django.contrib.auth.models import User
    
    def register(request):
        form_objs = UserInfoForm()
        if request.method=='POST':
            form_objs= UserInfoForm(request.POST)
            if form_objs.is_valid():
                username = form_objs.cleaned_data['name']
                password = form_objs.cleaned_data['pwd']
                #只能使用auth表的create_user方法去创建用户
                User.objects.create_user(username=username,password=password)
                return redirect('/login/')
        return render(request,'register.html',locals())
    

    创建超级用户的方法和上面一样,只不过变成User.objects.create_superuser

    校验密码和设置密码

    在用户登陆成功后通常需要验证密码和修改密码,auth组件也提供了相应的方法

    # user为User表具体的对象,接受一个密码,返回布尔值
    user.check_password(password)
    
    
    # user为User表具体的对象,接受一个密码,修改原密码,一定要记得save()保存
    user.set_password(password)
    user.save()
    

    扩展auth_user自定义表

    1. 建表继承AbstractUser

    from django.db import models
    
    # Create your models here.
    from django.contrib.auth.models import  AbstractUser
    
    class UserInfo(AbstractUser):
        #编写扩展字段,然后去settings告诉django auth组件会用这张表
        phone =models.CharField(max_length=11)
    

    2. 在django配置指定

    AUTH_USER_MODEL = app01.UserInfo
    #格式:app名称.表名
    

    总结

    auth认证
    		默认Django内置的认证系统, 默认在数据库中使用auth_user
    		from django.contrib import auth
    1. 创建一个超级用户
    	python manage.py createsuperuser
    2. 验证用户名和密码是否正确
    	user = auth.authenticate(request, username, password)
    3. 登录
    	auth.login(request, user)   --> user是上一步的得到的user对象
    4. 注销
    	auth.logout(request)        --> 将当前请求的session数据删除
    
    5. 登录认证的装饰器
    	auth.decorators.login_required
    	默认跳转的登录url: /accounts/login/
    	在settings.py中 配置 LOGIN_URL = "你的登录url"
    
    6. is_authenticated()
    	判断当前request.user是否经过认证,经过认证就返回True,否则是False
    	
    7. AuthenticationMiddleware中间件究竟做了什么?
    	request.user = user, 匿名用户对象
    	
    auth_user表的方法
        8. create_user()
        创建用户,不同与普通orm目的是使密码加密保存
        9. create_superuser()
        创建超级用户
        10. check_password()
        检查密码
        11. set_password()
        设置密码
    

    使用流程:

    1. 登陆时校验用户密码 auth.authenticate(username,password)生成user对象
    2. 给通过校验的user对象添加session, auth.login(request,user)
    3. 添加session成功后,后续的请求,request.user=user对象,可拿到数据库数据
    4. 注销,auth.logout(request),将浏览器保存的sessionkey清除掉
    5. user表的创建用户,不同于普通orm操作,因为密码需要加密保存,User.objects.create_user(), User.objects.create_superuser().
    6. user对象的方法:user.check_password(password),user.set_password(passord)
    7. 判断用户是否通过校验,request.user.is_authenticated(),返回一个布尔值(不常用)
  • 相关阅读:
    C++编程开发学习的50条建议(转)
    编程思想:我现在是这样编程的(转)
    Linux系统编程@多线程与多进程GDB调试
    字符串分割函数 STRTOK & STRTOK_R (转)
    C语言指针与数组的定义与声明易错分析
    C语言 a和&a的区别
    C语言二重指针与malloc
    【C语言入门】C语言的组成结构(基础完整篇)!
    程序员吐槽女友败家:开酒店必须400元起步,工资却不到自己的一半!
    怎样才能和编程语言对上眼?你需要做些准备以及...
  • 原文地址:https://www.cnblogs.com/Kingfan1993/p/10049674.html
Copyright © 2011-2022 走看看