基于Django用户认证系统详解

yipeiwu_com6年前Python基础

一. 认证系统概要

create_user 创建用户

authenticate 验证登录

login 记住用户的登录状态

logout 退出登录

is_authenticated 判断用户是否登录

login_required 判断用户是否登录的装饰器

二. 创建用户和验证登录

当用户注册的时候用create_user(username,password,email)默认情况下is_active=True,is_staff=False,is_superuser=False。

底层将password用hash算法加密之后存储到数据库中。

当用户登录的时候用authenticate(username=username,password=password)验证登录,判断数据库中是否存在用户输入的账号和密码,返回一个user对象。

底层将password用hash算法加密后和数据库中password进行对比。

三. 记住用户的登录状态

当用户登录的时候用login(request,user)来记住用户的登录状态,默认将用户的id存储在session中。

login有两个参数一个是request,一个是user,user的来源必须是authenticate返回的。也就是说用login之前必须先调用authenticate。

四. 退出登录

当用户注销的时候用logout(request),只需要一个参数request。

五. 判断用户是否登录

在后台的视图函数里可以用request.user.is_authenticated()判断用户是否登录

在前端页面中可以用{% if user.is_authenticated %}{% endif %}判断用户是否登录

六. 装饰器判断用户是否登录

基于普通的视图函数可以使用@login_required来装饰,但是基于类视图的get和post方法不能直接使用@login_required来装饰。

基于类视图的装饰有以下三种:

第一种:在urls文件中导入login_requtred,直接装饰as_view()函数

url(r'^$', login_required(UserInfoView.as_view()), name='user') 

第二种:自定义一个LoginRequiredView类继承View类,重写as_view()函数,并装饰as_view()函数的返回值。 我们自定义的视图类就不需要再继承View类,直接继承LoginRequiredView类就好了。

class LoginRequiredView(View):
  @classmethod
  def as_view(cls, **initkwargs):
    # 调用View类中as_view方法
    view = super(LoginRequiredView, cls).as_view(**initkwargs)
    # 调用login_required装饰器
    return login_required(view)

第三种:自定义一个LoginRequiredMixin类,重写as_view()函数,调用View中的as_view()函数,并装饰as_view()函数的返回值。 我们自定义的视图类需要先继承LoginRequiredMixin类再继承View类。这种方式的关键点在于:多继承中super()的调用顺序和__mro__的顺序是一样的。

class LoginRequiredMixin(object):
  @classmethod
  def as_view(cls, **initkwargs):
    # 调用View类中as_view方法
    view = super(LoginRequiredMixin, cls).as_view(**initkwargs)
    # 调用login_required装饰器
    return login_required(view)

以上这篇基于Django用户认证系统详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持【听图阁-专注于Python设计】。

相关文章

Python自动化测试ConfigParser模块读写配置文件

Python自动化测试ConfigParser模块读写配置文件 ConfigParser 是Python自带的模块, 用来读写配置文件, 用法及其简单。 直接上代码,不解释,不多说。 配...

python判断单向链表是否包括环,若包含则计算环入口的节点实例分析

python判断单向链表是否包括环,若包含则计算环入口的节点实例分析

本文实例讲述了python判断单向链表是否包括环,若包含则计算环入口的节点。分享给大家供大家参考,具体如下: 关于数据结构相关的面试题,经常会问到链表中是否存在环结构的判断,下图就是存在...

Python进程池Pool应用实例分析

本文实例讲述了Python进程池Pool应用。分享给大家供大家参考,具体如下: 当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程...

python利用正则表达式搜索单词示例代码

前言 在python中,通过内嵌集成re模块,程序媛们可以直接调用来实现正则匹配。正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行。 比如下面的例子,就是用来从一段文字...

在SQLite-Python中实现返回、查询中文字段的方法

博主在这个问题上卡了挺久的,贴出来解决方法帮助需要的朋友,直接上代码(测试环境:win10+Python2.7): # coding=utf-8 import sqlite3...