Django内建用户系统
14.1 Django中的用户认证
-  Django带有一个用户认证系统系统,它处理用户用户账号、组、权限以及基于cookie的用户会话。 
-  用户可以直接使用Django自带的用户表。 
-  官方文档:https://docs.djangoproject.com/zh-hans/2.2/topics/auth/ 
14.2 用户系统表的基本字段
模型类位置 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 | 用户创建的时间 | 
14.3 用户系统的基本模型操作
-  创建普通用户 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,用户注册页。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Register</title> </head> <body> <form method="post" action="{% url 'register_page' %}"> {% csrf_token %} {{ form }} <input type="submit" value="Submit"> </form> </body> </html>login.html,用户登录页。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Login</title> </head> <body> <form method="post" action="{% url 'login' %}"> {% csrf_token %} {{ form }} <input type="submit" value="Submit"> </form> </body> </html>homepage.html,首页。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>homepage</title> </head> <body> <form method="post" action="{% url 'logout' %}"> {% csrf_token %} 欢迎访问项目 <input type="submit" value="注销用户"> </form> </body> </html>
-  编写对应的视图函数。 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进行登录。  登录成功,跳转至项目首页。  再打开一个标签页,注销登录后,项目首页无法访问。  
14.4 用户系统的扩展字段
-  通过建立新表,跟内建表做一对一映射。 
-  继承内建的抽象User模型类。 
14.4.1 继承内部抽象类
步骤:
-  添加新的应用。 
-  定义模型类,集成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='euansu@euansu.cn', phone=13000000000) 查看数据库  使用新创建的用户登录刚才的项目,可以正常登录。 










