Django之用户认证功能

Posted Python

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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  二龙湖浩哥

 

 

以上是关于Django之用户认证功能的主要内容,如果未能解决你的问题,请参考以下文章

Django REST框架--认证和权限

1005.Django项目用户功能之认证权限以及班级管理

django之用户认证组件

Django之auth模块用户认证模块

Django之auth认证组件

Django基础十一之认证系统