一、常规认证方法

我们学生管理之登录实现一文中已经了解了自己写一个登录逻辑的过程:

1、url配置

urlpatterns = [

    url(r'^login/$', views.login),
url(r'^index/$', views.index),
url(r'^logout/$', views.logout),
]

  

2、写登录逻辑

def login(request):
if request.method == "POST":
username = request.POST.get("username")
password = request.POST.get("password") user = models.User.objects.filter(username=username, password=password).first()
if user:
# 登陆成功
request.session["is_login"] = "1"
request.session["user_id"] = user.id
# 1. 生成特殊的字符串
# 2. 特殊字符串当成key,在数据库的session表中对应一个session value
# 3. 在响应中向浏览器写了一个Cookie Cookie的值就是 特殊的字符串 return redirect("/index/") return render(request, "login.html")

  

3、登录限制

有一些内容是需要用户登录之后才能查看,所以这里就涉及到了登录限制。刚开始我写登录的时候通过装饰器来实现:

from functools import wraps

def login_required(f):
@wraps(f)
def inner(request, *args, **kwargs):
if request.session.get("is_login") == "1":
return f(request, *args, **kwargs)
else:
return redirect("/login/")
return inner @login_required
def index(request):
user_id = request.session.get("user_id")
# 根据id去数据库中查找用户
user_obj = models.User.objects.filter(id=user_id).first()
if user_obj:
return render(request, "index.html", {"user": user_obj})
else:
return render(request, "index.html", {"user": "匿名用户"})

  

4、登出

def logout(request):
request.session.flush()
return redirect("/login/")

  

自己实现登录流程的话,一般是经过以上4个步骤。但是,Django是一个大而全的框架,它早已经为你写好了登录模块。

既然是已经写好的模块,那么我们就可以开箱即用!

二、使用Django自带的Auth模块实现登录

使用Django自带的Auth模块,只要直接使用里面写好的方法就行。

1、url配置

同上。

2、登录逻辑

def login(request):
if request.method == "POST":
#获取用户提交数据
username = request.POST.get("username")
pwd = request.POST.get("password") # 如何判断用户名和密码对不对
user = auth.authenticate(username=username, password=pwd)
if user:
ret = user.is_authenticated()
# 将登录的用户封装到request.user
auth.login(request, user)
return redirect("/index/")
return render(request, "login.html")

  


3、登录限制

导入装饰器

from django.contrib.auth.decorators import login_required

  

使用装饰器

@login_required
def index(request):
ret = request.user.is_authenticated()
return render(request, "index.html")

  注意:需要在setttings中设置参数LOGIN_URL = "/login/",这样如果检测到需要登录的页面没有登录,则会直接跳转到:http://localhost:8000/login/?next=/index/

4、登出

def logout(request):
auth.logout(request)
return redirect("/login/")

  登出其实就是清理工作。

从上可以看出,其实整体流程还是一样,只是auth模块帮我们写好了一些逻辑,我们只要调用其方法即可。

三、扩展Auth模块

我们在上面可以看到auth模块有一张已经生成好的用户表,包括username、passwd、email、last_date。。。等等,但是如果我们希望自己增加一些定制化的字段,怎么操作呢?

扩展流程:

1、新建一张表,继承AbstractUser

from django.contrib.auth.models import AbstractUser

  

models中新增字段:

class UserInfo(AbstractUser):
phone = models.CharField(max_length=11)
addr = models.CharField(max_length=128)

 相当于对默认的auth_user表做了扩展, 并且代替auth_user

2、生成数据表makemigrations

3、添加变量

在settings.py中一定要加AUTH_USER_MODEL = 'app名.类名'

# 如果使用继承的方式 使用内置的auth模块,要在settings.py里面配置 默认用户认证时使用的是哪张表
AUTH_USER_MODEL = 'app01.UserInfo'

  这样,就扩展了auth模块自带的user表。

Django真的很全,使用的时候你就会感觉到,能想到的功能,Django基本上都帮你实现了,真棒!

四、Auth模块主要方法

a、authenticate()

authenticate方法会在该 User 对象上设置一个属性来标识后端已经认证了该用户,且该信息在后续的登录过程中是需要的。

user = authenticate(username='theuser',password='thepassword')

  

b、login(HttpRequest, user)

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

该函数实现一个用户登录的功能。它本质上会在后端为该用户生成相关session数据。

if user_obj:
login(request, user_obj)
# 跳转到登录成功页面
...
else:
# 返回错误信息
...

  

c、logout(request) 

该函数接受一个HttpRequest对象,无返回值。

当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。主要是清理session工作。

request.session.flush()

  

d、is_authenticated()

该方法用来判断用户是否经过了认知

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

  

e、login_required

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
...

  

f、create_superuser()

from django.contrib.auth.models import User
user_obj = User.objects.create_superuser(username='用户名',password='密码',email='邮箱',...)

  

 

g、check_password(raw_password)

auth 提供的一个检查密码是否正确的方法,需要提供当前请求用户的密码。

密码正确返回True,否则返回False。

ret = user_obj.check_password('密码')

  

h、set_password(raw_password)

auth 提供的一个修改密码的方法,接收 要设置的新密码 作为参数。

注意:设置完一定要调用用户对象的save方法!!!

user_obj.set_password('新密码')
user_obj.save()

  

i、create_user

User.objects.create_user(username='用户名',password='密码',email='邮箱',...)

十一、Django认证模块--Auth模块的更多相关文章

  1. Django的认证系统—auth模块

    Django的认证系统 auth模块的知识点总结: 1. 创建超级用户 python manage.py createsuperuser from django.contrib import auth ...

  2. (day59)十一、CSRF、Auth模块、impotlib模块、settings源码

    目录 一.模拟实现中间件的编程思想 (一)impotlib模块 (二)实现功能的配置使用 二.跨站请求伪造CSRF (一)由来 (二)form表单的CSRF (三)ajax中的CSRF (1)通过da ...

  3. Django框架中auth模块的详解

    auth模块 auth模块是对登录认证方法的一种封装,本身就是一个对象,可以获取用户的详细信息,有了auth模块可以验证登录信息是否存在数据库中,还可以检验用户是否已经登录,校验密码等 auth方法 ...

  4. [Django高级之Auth模块]

    [Django高级之Auth模块] auth模块 ←详情点击查看 1.Auth模块是什么 Auth模块是Django自带的用户认证模块: 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统 ...

  5. Django认证系统auth认证

    使用Django认证系统auth认证 auth认证系统可以处理范围非常广泛的任务,且具有一套细致的密码和权限实现.对于需要与默认配置不同需求的项目,Django支持扩展和自定义认证;会将用户信息写入到 ...

  6. Django之自带的认证系统 auth模块

    01-Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Dj ...

  7. Django 自带认证功能auth模块和User对象的基本操作

    一.auth模块 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: authenticate()    ...

  8. Django的认证系统 auth模块

    Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Djang ...

  9. Django的自带认证系统——auth模块

    Django自带的用户认证 auth模块 from django.contrib import auth 备注:使用auth模块时,我们默认使用Django提供的auth_user表,创建数据时,可以 ...

随机推荐

  1. Loadrunner11代理录制&各个常见功能介绍

    1.代理录制: Lr代理工具:C:\Program Files (x86)\HP\LoadRunner\bin\wplus_init_wsock.exe 1) 设置代理 配置代理信息: 2)设置浏览器 ...

  2. 一个好玩的计算题目(c++ 位运算)

    2015/11/10 在一个qq群里面,看到一个好玩的题目.“int foo(int x){return x&-x}   foo(2^31-3)这个怎么算 ?” 1.自己也就开始算了: (1) ...

  3. 导出Excel 2007 (NPOI)

    今天在导出Excel2007时报了个错,问是否修复,点yes就提示修复正常了,但具体什么原因没说,如图 之前简单的导出代码是这样写的 public static void ExportToWeb(st ...

  4. Collection集合 总结笔记

    2:Set集合(理解)     (1)Set集合的特点         无序,唯一     (2)HashSet集合(掌握)         A:底层数据结构是哈希表(是一个元素为链表的数组)     ...

  5. 内置数据结构(list)

    列表.元组.字符串.字典和集合是python内置的数据结构,也可以叫内置容器.前3个是线性结构,线性结构可以切片操作.解包和封包操作. dir()方法可以查看对象拥有哪些属性和方法. help()方法 ...

  6. int to string & string to int

    #include "stdafx.h" #include <string> #include <sstream> using namespace std; ...

  7. 使用 CSS 根据兄弟元素的个数来调整样式

    在某些场景下,我们需要根据兄弟元素的总数来为它们设置样式.最常见的场景就是,当一个列表不断延长时,通过隐藏控件或压缩控件等方式来节省屏幕空间,以此提升用户体验. 为保证一屏内容能展示更多的内容,需要将 ...

  8. python中pandas里面的dataframe数据的筛选小结

    pandas大家用的都很多,像我这种用的不够熟练,也不够多的就只能做做笔记,尽量留下点东西吧. 筛选行: a. 按照列的条件筛选 df = pandas.DataFrame(...) # suppos ...

  9. 2.3 Python语言基础

    2.3 Python语言基础 1 语言语义(Language Semantics) 缩进,而不是括号 Python使用空格(tabs or spaces)来组织代码结构,而不是像R,C++,Java那 ...

  10. BZOJ4571:[SCOI2016]美味(主席树,贪心)

    Description 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1≤i≤n).有 m 位顾客,第 i 位顾客的期望值为 bi,而他的偏好值为 xi . 因此,第 ...