Django的用户认证
https://docs.djangoproject.com/en/2.0/topics/auth/default/ 官方文档关于用户认证的介绍!
我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能,这还真是个麻烦的事情呢。
Django作为一个完美主义者的终极框架,当然也会想到用户的这些痛点。它内置了强大的用户认证系统--auth,它默认使用 auth_user 表来存储用户数据。
Auth模块中提供了很多的方法,最常用到的方法做了如下几个归纳
1、authenticate()
from django.contrib import auth<wiz_code_mirror>
1
1
from django.contrib import auth
提供了用户认证功能,即验证用户名以及密码是否正确,一般需要username 、password两个关键字参数。如果认证成功(用户名和密码正确有效),便会返回一个 User 对象。
验证用户名和密码
user = authenticate(username='theuser',password='thepassword')<wiz_code_mirror>
1
1
user = authenticate(username='theuser',password='thepassword')
2、auth.login(request, user)
将验证过的用户注入 request.user属性 ,这样模版里面可以通过{{request.user}}来获取到具体的用户名
from django.contrib.auth import authenticate, login def my_view(request): username = request.POST['username'] password = request.POST['password'] user = authenticate(username=username, password=password) if user is not None: login(request, user) # Redirect to a success page. ... else: # Return an 'invalid login' error message. ...<wiz_code_mirror>
13
1
from django.contrib.auth import authenticate, login
2
3
def my_view(request):
4
username = request.POST['username']
5
password = request.POST['password']
6
user = authenticate(username=username, password=password)
7
if user is not None:
8
login(request, user)
9
# Redirect to a success page.
10
...
11
else:
12
# Return an 'invalid login' error message.
13
...
3、logout(request)
用于登出
该函数接受一个HttpRequest对象,无返回值。当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。
from django.contrib.auth import logout def logout_view(request): logout(request) # Redirect to a success page.<wiz_code_mirror>
5
1
from django.contrib.auth import logout
2
3
def logout_view(request):
4
logout(request)
5
# Redirect to a success page.
4、is_authenticated()
用来判断当前请求是否通过了认证。
多用于前端页面判断用户是否登录
{{ user.is_authenticated }} # 返回True / False {% if user.is_authenticated %} {% else %} {% endif %}<wiz_code_mirror>
x
1
{{ user.is_authenticated }} # 返回True / False
2
3
{% if user.is_authenticated %}
4
5
{% else %}
6
7
{% endif %}
def my_view(request): if not request.user.is_authenticated(): return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))<wiz_code_mirror>
3
1
def my_view(request):
2
if not request.user.is_authenticated():
3
return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
5、check_password(password)
auth 提供的一个检查密码是否正确的方法,需要提供当前请求用户的密码。密码正确返回True,否则返回False。
6、set_password(password)
auth 提供的一个修改密码的方法,接收 要设置的新密码 作为参数。注意:设置完一定要调用用户对象的save方法!!!
User对象属性
1、is_staff : 用户是否拥有网站的管理权限.
2、is_active : 是否允许用户登录, 设置为 False,可以在不删除用户的前提下禁止用户登录。
拓展默认的auth_user表
这内置的认证系统这么好用,但是auth_user表字段都是固定的那几个,我在项目中没法拿来直接使用啊!比如,我想要加一个存储用户手机号的字段,怎么办?聪明的你可能会想到新建另外一张表然后通过一对一和内置的auth_user表关联,这样虽然能满足要求但是有没有更好的实现方式呢?
答案是当然有了。
我们可以通过继承内置的 AbstractUser 类,来定义一个自己的Model类。
这样既能根据项目需求灵活的设计用户表,又能使用Django强大的认证系统了。
from django.contrib.auth.models import AbstractUser class UserInfo(AbstractUser): """ 用户信息表 """ nid = models.AutoField(primary_key=True) phone = models.CharField(max_length=11, null=True, unique=True) def __str__(self): return self.username<wiz_code_mirror>
10
1
from django.contrib.auth.models import AbstractUser
2
class UserInfo(AbstractUser):
3
"""
4
用户信息表
5
"""
6
nid = models.AutoField(primary_key=True)
7
phone = models.CharField(max_length=11, null=True, unique=True)
8
9
def __str__(self):
10
return self.username
settings.py
# 引用Django自带的User表,继承使用时需要设置 AUTH_USER_MODEL = "app名.UserInfo"<wiz_code_mirror>
1
# 引用Django自带的User表,继承使用时需要设置
2
AUTH_USER_MODEL = "app名.UserInfo"