zoukankan      html  css  js  c++  java
  • django的用户认证组件

    DataSource:https://www.cnblogs.com/yuanchenqi/articles/9064397.html

    代码总结:

    用户认证组件:
        功能:用session记录登录验证状态
        前提:用户表:django自带的auth_user
        创建超级用户:python3 manage.py createsuperuser
        
        API:
            from django.contrib import auth:
                1 #if 验证成功返回user对象,否则返回None
                user=auth.authenticate(username=user,password=pwd)
                2 auth.login(request,user) # request.user:当前登录对象
                3 auth.logout(request)
            from django.contrib.auth.models import User # User==auth_user
                4 request.user.is_authenticated()
                5 user = User.objects.create_user(username='',password='',email='') # 这个方法密码会加密处理
            补充:
                匿名用户对象:
                    匿名用户
                    class models.AnonymousUser
                    django.contrib.auth.models.AnonymousUser 类实现了django.contrib.auth.models.User接口,但具有下面几个不同点:
                    id 永远为None。
                    username 永远为空字符串
                    get_username() 永远返回空字符串。
                    is_staff 和 is_superuser 永远为False。
                    is_active 永远为False。
                    groups 和 user_permissions 永远为空。
                    is_anonymous() 返回True 而不是False。
                    is_authenticated() 返回False而不是True。
                    set_password()、check_password()、save()、和delete()引发NotImplementedError。
                    New in Django 1.8:
                    新增AnonymousUser.get_username() 以更好的模拟 django.contrib.auth.models.User。
            总结:
                if not: auth.login(request,user)  request.user==AnonymousUser()
                else:request.user==登陆对象
                
                request.user是一个全局变量
                
    View Code

    笔记:

    用户认证组件:
        功能:用session记录用户登录信息
        前提:用户表:django自带的auth_user
        创建超级用户:python3 manage.py createsuperuser
        API:
            from django.contrib import auth
                auth.authenticate
                auth.login
                auth.logout
            from django.contrib.auth.models import User
                request.user.is_authenticated
                User.objects.create_user
            补充:
                匿名对象特点:
                class models.AnonymousUser
            总结:
                request.user
        
        # 如果验证成功,返回user对象,否则返回null
        user=auth.authenticate(username=user,password=pwd)
        if user:
            auth.login(request,user) # 意味着request.user=user 当前登录对象
            return redirect("/index/")    
        
        <h3>{{ request.user.username }}</h3>
    View Code

    auth模块

     from django.contrib import auth 

    django.contrib.auth中提供了许多方法,这里主要介绍其中的三个:

    1.1 、authenticate()

    提供了用户认证,即验证用户名以及密码是否正确,一般需要username  password两个关键字参数

    如果认证信息有效,会返回一个  User  对象。authenticate()会在User 对象上设置一个属性标识那种认证后端认证了该用户,且该信息在后面的登录过程中是需要的。当我们试图登陆一个从数据库中直接取出来不经过authenticate()的User对象会报错的!!

     user = authenticate(username='someone',password='somepassword') 

    1.2 、login(HttpRequest, user)

    该函数接受一个HttpRequest对象,以及一个认证了的User对象

    此函数使用django的session框架给某个已认证的用户附加上session id等信息。

    from django.contrib.auth import authenticate, login
       
    def my_view(request):
      username = request.POST['username']
      password = request.POST['password']
      user = authenticate(username=username, password=password)
      if user is not None:
        login(request, user)
        # Redirect to a success page.
        ...
      else:
        # Return an 'invalid login' error message.
        ...
    View Code

    1.3 、logout(request) 注销用户

    from django.contrib.auth import logout
       
    def logout_view(request):
      logout(request)
      # Redirect to a success page.
    View Code

    该函数接受一个HttpRequest对象,无返回值。当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。

    User对象

    User 对象属性:username, password(必填项)password用哈希算法保存到数据库

    2.1 、user对象的 is_authenticated()

    如果是真正的 User 对象,返回值恒为 True 。 用于检查用户是否已经通过了认证。
    通过认证并不意味着用户拥有任何权限,甚至也不检查该用户是否处于激活状态,这只是表明用户成功的通过了认证。 这个方法很重要, 在后台用request.user.is_authenticated()判断用户是否已经登录,如果true则可以向前台展示request.user.name

    要求:

    1  用户登陆后才能访问某些页面,

    2  如果用户没有登录就访问该页面的话直接跳到登录页面

    3  用户在跳转的登陆界面中完成登陆后,自动访问跳转到之前访问的地址

    方法1:

    def my_view(request):
      if not request.user.is_authenticated():
        return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

    方法2:

    django已经为我们设计好了一个用于此种情况的装饰器:login_requierd()

     from django.contrib.auth.decorators import login_required @login_required def my_view(request): ... 

    若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ' (这个值可以在settings文件中通过LOGIN_URL进行修改)。并传递  当前访问url的绝对路径 (登陆成功后,会重定向到该路径)。

    2.2 、创建用户

    使用 create_user 辅助函数创建用户:

     from django.contrib.auth.models import User user = User.objects.create_user(username='',password='',email='' 

    2.3 、check_password(passwd)

    用户需要修改密码的时候 首先要让他输入原来的密码 ,如果给定的字符串通过了密码检查,返回 True

    2.4 、修改密码

    使用 set_password() 来修改密码

    user = User.objects.get(username='')
    user.set_password(password='')
    user.save
    View Code

    2.5 、简单示例

    注册:

    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
        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

    views.py

    from django.shortcuts import render,HttpResponse,redirect
    
    # Create your views here.
    
    from django.contrib import auth
    from django.contrib.auth.models import User
    from django.contrib.auth.decorators import login_required
    
    def login(request):
    
        if request.method == "POST":
            user = request.POST.get("user")
            pwd = request.POST.get("pwd")
    
            # if 验证成功返回user对象,否则返回None
            user=auth.authenticate(username=user,password=pwd)
    
            if user:
                auth.login(request,user)   # request.user:当前登录对象
    
                next_url=request.GET.get("next","/index/")
                return  redirect(next_url)
    
    
        return render(request,"login.html")
    
    
    
    @login_required
    def index(request):
    
        # print("request.user:",request.user.username)
        # print("request.user:",request.user.id)
        # print("request.user:",request.user.is_anonymous)
        #
        # #if request.user.is_anonymous:
        # if not request.user.is_authenticated:
        #     return redirect("/login/")
    
        #username=request.user.username
        #return render(request,"index.html",{"username":username})
    
        return render(request,"index.html")
    
    
    @login_required
    def order(request):
    
        # if not request.user.is_authenticated:
        #     return redirect("/login/")
    
    
        return render(request,"order.html")
    
    
    
    
    
    
    
    def logout(request):
    
        auth.logout(request)
    
        return redirect("/login/")
    
    
    
    
    def reg(request):
        if request.method=="POST":
            user = request.POST.get("user")
            pwd = request.POST.get("pwd")
    
            #User.objects.create(username=user,password=pwd)
            user=User.objects.create_user(username=user,password=pwd)
    
            return redirect("/login/")
    
    
        return render(request,"reg.html")
    View Code
  • 相关阅读:
    PAT (Advanced Level) Practice 1054 The Dominant Color (20 分)
    PAT (Advanced Level) Practice 1005 Spell It Right (20 分) (switch)
    PAT (Advanced Level) Practice 1006 Sign In and Sign Out (25 分) (排序)
    hdu 5114 Collision
    hdu4365 Palindrome graph
    单链表查找最大值、两个递增的链表合并并且去重
    蓝桥杯-最短路 (SPFA算法学习)
    蓝桥杯-最大最小公倍数
    Codeforces-470 div2 C题
    蓝桥杯-地宫取宝
  • 原文地址:https://www.cnblogs.com/fmgao-technology/p/9527966.html
Copyright © 2011-2022 走看看