zoukankan      html  css  js  c++  java
  • Django之用户认证功能

    前言

    做web应用对登录做用户身份认证,然后设置session是必不可少的,因为我们就需要把有权限访问本站视图的用户,单独建一张表记录到数据库里;

    Django作为一个大而全的框架,已经为我们做好了这些准备;

    from django.shortcuts import render,HttpResponse,redirect
    
    def login(request):
        if request.method=='GET':
            return render(request,'login.html')
        user=request.POST.get('user')
        pwd=request.POST.get('pwd')
        print(user,pwd)
        if user=='张根' and pwd=='123.com': #1、用户认证
            request.session['name']=user      #2、属于本站用户设置session,识别用户身份
            request.session['status'] = True
            return redirect('/index')
        else:
            error='用户名/密码错误'
            return render(request,'login.html',locals())
    
    
    def index(request):                    #3、其他视图,做用户身份检查
        status=request.session.get('status')
        if status:
            return HttpResponse('index')
        else:
            return redirect('/login/')
    View Code

     一、认证登录

    from django.contrib import auth  导入Django自带的认证模块

      python manage.py createsuperuser 创建一个超级用户,本文不涉及用户权限管理;

    用户创建完成之后密码加密成密文显示,呵呵 人性化吧?

    1  authenticate(username=username,password=password)   

     检查用户是存在在auth_user表及用户名和密码是否正确?

    如果认证 成功 会返回一个 user对象,否则返回None。

    2、login(HttpRequest, user) 

    该函数接受一个HttpRequest对象,以及一个认证了的User对象,给用户设置cookie+session

    def log_in(request):
        if request.method=='GET':
            nextpath=request.GET.get('next','/index/')
            return render(request,'login1.html',locals())
    
        else:
            username=request.POST.get('username')
            password=request.POST.get('password')
            #密码zhanggen123.com
            valid_code=request.POST.get('valid_code')
            #设置统一报错信息
            ajax_response = {"user": None, "errors": ""}
            #如果验证和 session中设置的验证码一致,
            if valid_code.upper()==request.session.get('valid_code').upper():
                # 进行用户验证
                user=authenticate(username=username,password=password)
                if user:
                    login(request,user)
                    ajax_response['user']=user.username
                else:
                    ajax_response['errors'] ='用户名/密码错误'
            else:
                ajax_response['errors'] = '验证码错误'
            return HttpResponse(json.dumps(ajax_response))
    View Code

    3、  logout(request) 注销用户 

    用户注销:删除当前登录用户的session信息

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

    def log_out(request):
        logout(request)
        return redirect('/index/')

     4、user对象的 is_authenticated()  和@login_required

     检查当前用户是否验证过?返回布尔值 true和flase

    要求:

    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:

    from django.contrib.auth.decorators import login_required
         
    @login_required   就不用在一个个视图函数中做is_authenticated()验证了。
    def my_view(request):
      ...

    若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ '

    (这个值可以在settings文件中通过LOGIN_URL进行修改)。并传递  当前访问url的绝对路径 (登陆成功后,会重定向到该路径)。

    LOGIN_URL = '/login/ '

    二、用户操作相关User 对象方法  

    2.1  is_authenticated()

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

     

    2.2  创建用户

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

    models.UserInfo.objects.create_user(username=username,password=password,email=email,avatar=avatar)
    
    #注意create_user中的_

     

    2.3  修改用户密码

     set_password(passwd)

    def set_password(request):
        if request.method=='GET':
            return render(request,'set_password.html')
        else:
            oldpwd=request.POST.get('oldpwd')
            newpwd = request.POST.get('newpwd')
            user=request.user
            if user.check_password(oldpwd):
                user.set_password(newpwd)
                user.save()
                return redirect('/login/')

    2.4  check_password(passwd)

    检测用户的密码是否正确?如果给定的字符串通过了密码检查,返回 True
     

    2.5 修改密码实例

    使用 set_password() 来修改密码

    def set_password(request):
        if request.method=='GET':
            return render(request,'set_password.html')
        else:
            oldpwd=request.POST.get('oldpwd')
            newpwd = request.POST.get('newpwd')
            user=request.user
            if user.check_password(oldpwd):
                user.set_password(newpwd)
                user.save()
                return redirect('/login/')

    参考链接:http://www.cnblogs.com/yuanchenqi/articles/7439088.html#3770465  二龙湖浩哥

     
  • 相关阅读:
    洛谷 P1194 飞扬的小鸟 题解
    洛谷 P1197 星球大战 题解
    洛谷 P1879 玉米田Corn Fields 题解
    洛谷 P2796 Facer的程序 题解
    洛谷 P2398 GCD SUM 题解
    洛谷 P2051 中国象棋 题解
    洛谷 P1472 奶牛家谱 Cow Pedigrees 题解
    洛谷 P1004 方格取数 题解
    洛谷 P2331 最大子矩阵 题解
    洛谷 P1073 最优贸易 题解
  • 原文地址:https://www.cnblogs.com/sss4/p/7470982.html
Copyright © 2011-2022 走看看