Django带有一个用户认证系统系统,它处理用户用户账号、组、权限以及基于cookie的用户会话。
用户可以直接使用Django自带的用户表。
官方文档:https://docs.djangoproject.com/zh-hans/2.2/topics/auth/
模型类位置 from django.contrib.auth.models import User
字段名 | 含义 |
---|---|
username | 用户名 |
password | 密码 |
邮箱 | |
first_name | 名 |
last_name | 姓 |
is_superuser | 是否管理员账号 |
is_staff | 是否可以访问admin管理界面 |
is_active | 是否是活跃用户,默认为True,一般不删除用户,而是将用户的is_active设为False |
last_login | 上一次登录时间 |
date_joined | 用户创建的时间 |
创建普通用户 create_user:
from django.contrib.auth.models import User
user = User.objects.create_user(username='用户名', password='密码', email='邮箱', ...)
创建超级用户 create_superuser:
from django.contrib.auth.models import User
user = User.objects.create_superuser(username='用户名', password='密码', email='邮箱', ...)
删除用户:
from django.contrib.auth.models import User
try:
user = User.objects.get(username='用户名')
user.is_active = False
user.save()
print("删除普通用户成功")
except:
print("删除普通用户失败")
校验密码:
# 说明:如果用户名密码校验成功则返回对应的User对象,否则返回None
from django.contrib.auth import authenticate
user = authenticate(username=username, password=password)
修改密码:
from django.contrib.auth.models import User
try:
user = User.objects.get(username='用户名')
user.set_password('123456')
user.save()
print("修改密码成功")
except:
print("修改密码失败")
登录状态保持:
from django.contrib.auth import login,authenticate
def login_view(request):
user = authenticate(username='用户名', password='密码')
login(request, user)
登录状态校验:
from django.contrib.auth.decorators import login_required
@login_required
def index_view(request):
# 该视图必须为用户登录状态下才可以访问
# 当前登录用户可以通过request.user获取
login_user = request.user
...
用户注销登录:
from django.contrib.auth import logout
def logout_view(request):
logout(request)
代码示例:
创建 templates 目录,放置 html 页面。
编写对应的template页面。
register.html,用户注册页。
Register
login.html,用户登录页。
Login
homepage.html,首页。
homepage
编写对应的视图函数。
from django.shortcuts import render
from django.contrib.auth.models import User
from django.http import HttpResponseRedirect, HttpResponse
from django.contrib.auth import authenticate, login, logout
from .forms import loginForm, registerForm
from django.contrib.auth.decorators import login_required
# Create your views here.
def login_page(request):
"""
项目登录面
:param request:
:return:
"""
# return render(request, 'hello.html')
if request.method == 'POST':
form = loginForm(request.POST)
if form.is_valid():
# 处理表单提交逻辑,可以访问 form.cleaned_data 获取表单字段的值
username = form.cleaned_data['username']
password = form.cleaned_data['password']
if not username or not password:
return HttpResponse("请输入正确的参数")
# 校验密码
user = authenticate(username=username, password=password)
print('校验用户')
print(user)
if not user:
return HttpResponse("用户名或密码错误")
else:
# 记录会话状态
login(request, user)
return HttpResponseRedirect('/homepage')
else:
form = loginForm()
return render(request, 'login.html', {'form': form})
def register_page(request):
"""
项目注册页面
:param request:
:return:
"""
# return render(request, 'hello.html')
if request.method == 'POST':
form = registerForm(request.POST)
if form.is_valid():
# 处理表单提交逻辑,可以访问 form.cleaned_data 获取表单字段的值
username = form.cleaned_data['username']
password1 = form.cleaned_data['password1']
password2 = form.cleaned_data['password2']
if not username or not password1 or not password2:
return HttpResponse("请传入正确的参数")
# 进行注册操作
try:
if password1 != password2:
return HttpResponse("两次输入的密码不一致")
# 创建用户
user = User.objects.create_user(username=username, password=password1)
# 注册成功
return HttpResponseRedirect('/login')
except Exception as e:
# 注册失败
print(e)
return HttpResponse("注册用户失败,请联系管理员进行处理")
else:
form = registerForm()
return render(request, 'register.html', {'form': form})
def logout_func(request):
"""
注销登录
:param request:
:return:
"""
logout(request)
return HttpResponseRedirect('/login')
编写对应的路由函数。
from django.urls import path, re_path
from . import views
urlpatterns = [
path("", views.login_page, name='login'),
path("register/", views.register_page, name='register_page'),
path("logout/", views.logout_func, name='logout')
]
配置项目默认的登录页面。
# settings.py
# 配置了登录地址,当访问到需要登录的页面时,如果此时用户未登录,则跳转至登录页面
LOGIN_URL = '/login'
页面调用测试。
注册页面输入用户名,密码,确认密码后点击submit进行登录。
成功注册后,跳转至login页面,输入刚才注册的用户名和密码,点击submit进行登录。
登录成功,跳转至项目首页。
再打开一个标签页,注销登录后,项目首页无法访问。
通过建立新表,跟内建表做一对一映射。
继承内建的抽象User模型类。
步骤:
添加新的应用。
定义模型类,集成AbstractUser。
settings.py中指明AUTH_USER_MODEL='应用名.类名'。
注:该操作需要在第一次migrate之前进行,否则会报如下的错误。
代码测试:
添加新的应用。
python3 manage.py startapp useradmin
定义模型类,集成AbstractUser。
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
class UserInfo(AbstractUser):
phone = models.CharField(max_length=11, default='')
settings.py中指明AUTH_USER_MODEL='应用名.类名'。
AUTH_USER_MODEL = 'useradmin.UserInfo'
执行代码迁移。
python3 manage.py makemigrations
python3 manage.py migrate
迁移成功后,查看数据库,auth_user表消失,出现了一个useradmin_userinfo的表。
创建新用户测试。
from django.contrib.auth.models import User
user = User.objects.create_user(username='euansu', password='euansu', email='[email protected]', phone=13000000000)
查看数据库
使用新创建的用户登录刚才的项目,可以正常登录。