zoukankan      html  css  js  c++  java
  • auth认证模块

    auth模块

    在Django中创建数据库,会自动生成一个user表,表中有很多字段
    其中username, password(必填项)password用哈希算法保存到数据库
    导入auth模块
    from django.contrib import auth
    django.contrib.auth中提供了许多方法,这里主要介绍其中的三个:
    1.authenticate()
    提供了用户认证,即验证用户名以及密码是否正确,一般需要username  password两个关键字参数
    如果认证信息有效,会返回一个 User 对象。authenticate()会在User 对象上设置一个属性来标识后端已经认证了该用户,
    且该信息在后续的登录过程中是需要的。直接从user表中拿数据对比
    user = auth.authenticate(username=username, password=pwd)
    2.login(HttpRequest, user) 
    必须时认证成功的用户才能用,此函数使用django的session框架给某个已认证的用户附加上session id等信息
    session不能存放对象,而login将用户这个对象存起来,后续用到用户信息直接调用即可
    如 print(request.user.username)
    user = auth.authenticate(username=username, password=pwd)
    if user:
    # 将登录的用户封装到request.user
    auth.login(request, user)
    3.logout(request) 注销用户
    def logout(request):
    auth.logout(request) 相当于request.session.flush()
    return redirect("/login/")
    当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。
    4.装饰器:login_requierd()
    使用@login_required能实现的功能:
    1 用户登陆后才能访问某些页面,
    2 如果用户没有登录就访问该页面的话直接跳到登录页面
    3 用户在跳转的登陆界面中完成登陆后,自动访问跳转到之前访问的地址
    from django.contrib.auth.decorators import login_required
    @login_required
    def index(request):pass
    若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ' (这个值可以在settings.py文件中通过LOGIN_URL进行修改)
    在setting中添加:
    # 如果没有登录,默认跳转到那个URL
    LOGIN_URL = "/login/"

    User对象

    
    
    User 对象属性:username, password(必填项)password用哈希算法保存到数据库
    1.is_authenticated()
    如果是真正的 User 对象,返回值恒为 True 。 用于检查用户是否已经通过了认证。
    通过认证并不意味着用户拥有任何权限,
    在后台用request.user.is_authenticated()判断用户是否已经登录,如果true则可以向前台展示request.user.name
    @login_required
    def index(request):
    ret = request.user.is_authenticated()
    print(ret)
    return render(request, "index.html")
    2. create_user创建用户
    from django.contrib.auth.models import User
    user = User.objects.create_user(username='',password='',email='')
    3.check_password(passwd)校验密码
    ret = user_obj.check_password("alex1234")正确返回True,错误为False
    4.set_password() 修改密码
    user_obj.set_password("alex3714")
    user_obj.save()
    def register(request):
        from django.contrib.auth.models import User
        # User.objects.create(username="alex", password="alexdsb")  # 密码为明文,不用这个
        创建用户
        user_obj = User.objects.create_user(username="alex5", password="alexdsb")
        # 校验密码是否正确
        ret = user_obj.check_password("alex1234")
        print(ret)
        # 修改密码
        user_obj.set_password("alex3714")
        user_obj.save()
        return HttpResponse("o98k")
    手动创建认证
    <h1>欢迎来到家目录</h1>
    <h3>这是{{ use_obj.username }}的家目录</h3>
    <a href="/logout/"><h4>注销</h4></a>
    from functools import  wraps
    def check_login(func):
        @wraps(func)
        def inner(request,*args,**kwargs):
            rep=request.session.get('is_login')
            if rep:
                return func(request,*args,**kwargs)
            else:
                return render(request,"login.html")
        return inner
    def login(request):
        if request.method=='POST':
            name=request.POST.get("username")
            pwd=request.POST.get("passwd")
            print(name,pwd)
            user=models.Userinfo.objects.filter(username=name,passwd=pwd) #得到quersty
            if user:
                request.session['is_login']='1'
                ##也可设置其他项,表中有很多字段,一个个设置比较麻烦,可直接设置id,找到其他的信息
                request.session['user_id']=user[0].id ###user是个列表
                print(request.session.get('user_id'))
                return redirect("/home/")
        return render(request,"login.html")
    @check_login
    def home(request):
        use_id=request.session.get('user_id')
        use_obj=models.Userinfo.objects.get(id=use_id)
        return render(request,"home.html",{"use_obj":use_obj})
    def logout(request):
        request.session.flush()
        return  render(request,"login.html")
    Views.py
    注册示例代码
    def sign_up(request):
        state = None
        if request.method == 'POST':
            password = request.POST.get('password', '')
            repeat_password = request.POST.get('repeat_password', '')
            email=request.POST.get('email', '')
            username = request.POST.get('username', '')
            if User.objects.filter(username=username):
                    state = 'user_exist'
            else:
                    new_user = User.objects.create_user(username=username, password=password,email=email)
                    new_user.save()
     
                    return redirect('/book/')
        content = {
            'state': state,
            'user': None,
        }
        return render(request, 'sign_up.html', content) 
    View Code
    修改密码示例
    @login_required
    def set_password(request):
        user = request.user  #auth.login(request, user),得到已经封装的用户对象
        state = None
        if request.method == 'POST':
            old_password = request.POST.get('old_password', '')
            new_password = request.POST.get('new_password', '')
            repeat_password = request.POST.get('repeat_password', '')
            if user.check_password(old_password):
                if not new_password:
                    state = 'empty'
                elif new_password != repeat_password:
                    state = 'repeat_error'
                else:
                    user.set_password(new_password)
                    user.save()
                    return redirect("/log_in/")
            else:
                state = 'password_error'
        content = {
            'user': user,
            'state': state,
        }
        return render(request, 'set_password.html', content)
    View Code

    扩展自带的auth_user

    1.新建一个表, 一对一关联上面的auth_user表

    在models写入:
    from django.contrib.auth.models import User
    class UserDetail(models.Model):
    phone = models.CharField(max_length=11)
    user = models.OneToOneField(to=User) 不加引号,关联自己创建的表时加引号

    2.继承的方式

    from django.contrib.auth.models import AbstractUser
    class UserInfo(AbstractUser):
    phone = models.CharField(max_length=11)
    addr = models.CharField(max_length=128)
    相当于对默认的auth_user表做了扩展, 并且代替auth_user。auth_user不再存在
    注意:
    在settings.py中一定要加
    AUTH_USER_MODEL = 'app名.类名'
    # 告诉Django项目用哪张表做认证
    AUTH_USER_MODEL = 'blog.UserInfo'


    def register(request):
    from django.contrib.auth.models import User
    创建用户
    user_obj = User.objects.create_user(username="alex5", password="alexdsb")
    使用继承后,就没有User了,创建新用户需要改变
    def register(request):
    from app01 import models
    user_obj = modles.Userinfo.objects.create_user(username="alex5", password="alexdsb"


     
     
     
  • 相关阅读:
    #JavaScript 闭包问题详解 #打倒心魔
    Typora + cnblog 图片自动上传 (超详细哦)
    #FUNCTION#CALL对象中的函数内作用域问题.md
    #windows #Github #HOST
    #######对象迭代器######
    #为什么不建议使用for...in 去遍历数组
    #前后端附件传输,去重的一种方式#解决方案
    #页面滚动刷新的实现原理 #下拉刷新#上拉刷新#drag to fresh
    自己动手实现一个阻塞队列
    APC注入
  • 原文地址:https://www.cnblogs.com/zgf-666/p/9124261.html
Copyright © 2011-2022 走看看