• 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  二龙湖浩哥

     
  • 相关阅读:
    【转】织梦为栏目添加图片的方法
    写在php设计模式前
    memcache 开机启动
    php 列出当前目录
    print echo 的区别
    php 报错等级
    nginx 启动脚本
    centos 编译 安装php
    修改linux iptable规则
    linux yum 安装软件
  • 原文地址:https://www.cnblogs.com/sss4/p/7470982.html
Copyright © 2020-2023  润新知