• Django——auth


    一、auth组件介绍

    可以实现包括用户注册、用户登录、用户认证、注销、修改密码等功能,内置了强大的用户认证系统--auth,它其实就是一个app

    二、内置属性方法

    注意:在用属性方法前,必须进行数据库迁移,两条命令

    1. authenticate用户认证  

    settings.py  基本路径配置好

    urls.py注意每次配好路由

    login.html 

    ps : {% csrf_token %} 用上它不用注释csrf那个中间件了
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>登录</title>
    </head>
    <body>
    <form action="" method="post">
        {% csrf_token %} 
        <p>用户名:<input type="text" name="name"></p>
        <p>密码:<input type="password" name="password"></p>
        <p><input type="submit" value="提交"></p>
    </form>
    
    </body>
    </html>

    views.py

    from django.shortcuts import render, HttpResponse, redirect
    
    #from django.contrib.auth.models import User
    from django.contrib import auth
    def login(request):
        if request.method=='GET':
            return render(request,'login.html')
        else:
            name=request.POST.get('name')
            password=request.POST.get('password') # 明文
            ## 方案行不通,密码是密文的,永远匹配不成功
            # user=User.objects.filter(username=name,password=password)
            ## 使用此方案,有两个注意点
            ## 第一个参数必须是request对象
            ##必须用username和password不能用其他名,看源码
            user=auth.authenticate(request,username=name,password=password)
            if user:
                return HttpResponse('登录成功')
            else:
                return HttpResponse('用户名或密码错误')

    2.login

    # 调用auth后,表示用户登录了
    # 1 存了session
    # 2 以后所有的视图函数,都可以使用request.user,它就是当前登录用户
    auth.login(request,user)

    代码:

    urls.py略

    order.html   这里只是测试下

    <body>
    {{ request.user.username }}的订单页面,买了好多东西
    </body>

    index.html

    <body>
    {{ request.user.username }}登录了
    </body>

    views.py

    from django.shortcuts import render, HttpResponse, redirect
    from django.contrib.auth.models import User
    
    # 不管是否登录,都能访问
    def index(request):
    return render(request, 'index.html')
    def order(request):
       print(request.user)
    return render(request, 'order.html') ## 用户登录成功后存session from django.contrib import auth def login(request): if request.method=='GET': return render(request,'login.html') else: name=request.POST.get('name') password=request.POST.get('password') # 明文 ## 此方案行不通,密码是密文的,永远匹配不成功 # user=User.objects.filter(username=name,password=password) ## 使用此方案 ## 第一个参数必须是request对象 ##username和password user=auth.authenticate(request,username=name,password=password) if user: # 调用auth,表示用户登录了 # 1 存了session # 2 以后所有的视图函数,都可以使用request.user auth.login(request,user)
           return HttpResponse('登录成功')
    else: return HttpResponse('用户名或密码错误')

    3.logout

    urls.py略

    views.py

    def logout(request):
        # 后续再访问视图函数,就没有当前登录用户了request.user(匿名用户AnonymousUser)
        auth.logout(request)
        return redirect('/index/')

    oeder.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>订单页面</title>
    </head>
    <body>
    {{ request.user.username }}的订单页面,买了好多东西
    <br>
    <hr>
    <a href="/logout/">点我退出</a>
    </body>
    </html>

    4.is_authenticated

    # is_authenticated 返回True或者False,判断用户是否登录
    
    # 用在视图中views.py
    if request.user.is_authenticated:
        print('用户登录了')
    else:
        print('用户没有登录,匿名用户')
    
    # 用在模板中index.html
    {% if request.user.is_authenticated %}
    {{ request.user.username }} 登录了
        {% else %}
        <a href="/login/">滚去登录</a>
    {% endif %}

    5.login_requierd

    1 它是个装饰器, 装饰在视图函数上,只要没有登录,就进不来
    # 必须登录后才能访问
    @login_required(login_url='/login/')  #意思是如果没有登录就重定向到/login/

    代码:

    from django.shortcuts import render, HttpResponse, redirect
    from django.contrib import auth
    from django.contrib.auth.decorators import login_required
    
    def login(request):
        if request.method=='GET':
            return render(request,'login.html')
        else:
            name=request.POST.get('name')
            password=request.POST.get('password') # 明文
            ## 方案行不通,密码是密文的,永远匹配不成功
            # user=User.objects.filter(username=name,password=password)
            ## 使用此方案
            ## 第一个参数必须是request对象
            ##username和password
            user=auth.authenticate(request,username=name,password=password)
            if user:
                # 调用auth,表示用户登录了
                # 1 存了session
                # 2 以后所有的视图函数,都可以使用request.user
                auth.login(request,user)
                url=request.GET.get('next')
                if url:
                    return redirect(url)
                else:
                    return redirect('/index/')
            else:
                return HttpResponse('用户名或密码错误')
    
    
    # 必须登录后才能访问
    @login_required(login_url='/login/')
    def order(request):
        print(request.user)  # 如何实现的?
        print(request.user.username)  # AnonymousUser
    
        if request.user.is_authenticated:
            print('用户登录了')
        else:
            print('用户没有登录,匿名用户')
    
        return render(request, 'order.html')

    6.create_user

    # 使用内置的create_user或者create_superuser方法 superuser权限跟user不同
    user=User.objects.create_user(username=name,password=password)
    # user=User.objects.create_superuser(username=name,password=password)

    代码:

    views.py

    from django.contrib.auth.models import User
    
    def register(request):
        if request.method == 'GET':
            return render(request, 'register.html')
        else:
            name = request.POST.get('name')
            password = request.POST.get('password')
            # 注册用户(有问题,密码是明文)
            # user=User.objects.create(username=name,password=password)
            # print(user)
    
            # 使用内置的create_user或者create_superuser方法
            user = User.objects.create_user(username=name, password=password)
            # user=User.objects.create_superuser(username=name,password=password)
            return redirect('/login/')

    register.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>注册</title>
    </head>
    <body>
    <form action="" method="post">
        {% csrf_token %}
        <p>用户名:<input type="text" name="name"></p>
        <p>密码:<input type="password" name="password"></p>
        <p>确认密码:<input type="password" name="re_password"></p>
        <p><input type="submit" value="提交"></p>
    </form>
    </body>
    </html>

    7.check_password 校验密码

    ## 有了用户,校验密码是否正确
    # 先获取到用户对象
    user = User.objects.filter(username=name).first()
    # 判断密码是否正确
    flag=user.check_password(password)

    代码:

    def login(request):
        if request.method == 'GET':
            return render(request, 'login.html')
        else:
            name = request.POST.get('name')
            password = request.POST.get('password')  # 明文
            # 先获取到用户对象
            user = User.objects.filter(username=name).first()
            # 判断密码是否正确
            flag = user.check_password(password)
        
            if flag:
                auth.login(request, user)
                url = request.GET.get('next')
                if url:
                    return redirect(url)
                else:
                    return redirect('/index/')
            else:
                return HttpResponse('用户名或密码错误')

    8.set_password 修改密码

    views.py

    from django.contrib.auth.models import User

    def
    change_password(request): if request.method == 'GET': return render(request, 'change_pwd.html') else: old_pwd = request.POST.get('old_pwd') new_pwd = request.POST.get('new_pwd') re_new_pwd = request.POST.get('re_new_pwd')#注意要核验,不然出bug if request.user.check_password(old_pwd): # 密码正确再修改 request.user.set_password(new_pwd) # 一定要记住保存(****) request.user.save() return redirect('/login/') else: return HttpResponse('原来密码错误')

    index.html

    <body>
    
    {% if request.user.is_authenticated %}
        {{ request.user.username }} 登录了
        <br>
        <a href="/change_pwd/">修改密码</a>
    {% else %}
        <a href="/login/">滚去登录</a>
    {% endif %}
    
    
    </body>

    change_pwd.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>修改密码</title>
    </head>
    <body>
    <form action="" method="post">
            {% csrf_token %}
        <p>原密码:<input type="password" name="old_pwd"></p>
        <p>新密码:<input type="password" name="new_pwd"></p>
        <p>确认密码:<input type="password" name="re_new_pwd"></p>
        <p><input type="submit" value="提交"></p>
    </form>
    </body>
    </html>
  • 相关阅读:
    Laravel 手动分页实现
    大话Web-Audio-Api
    关于audio标签播放跨域的问题
    jquery的命名空间
    正则表达式的应用
    七天学会ASP.NET MVC (六)——线程问题、异常处理、自定义URL 【转】
    七天学会ASP.NET MVC (五)——Layout页面使用和用户角色管理 【转】
    七天学会ASP.NET MVC (四)——用户授权认证问题 【转】
    七天学会ASP.NET MVC (三)——ASP.Net MVC 数据处理 【转】
    七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递 【转】
  • 原文地址:https://www.cnblogs.com/guojieying/p/13878447.html
Copyright © 2020-2023  润新知