1 创建⽤户模块⼦应⽤
1.1 在项⽬包⽬录下 创建apps的python包。
1.2 在apps包下 创建应⽤userapp
$ cd 项⽬包⽬录/apps
$ python ../../manage.py startapp userapp
1.3 配置导包路径 默认情况下导包路径指向项⽬根⽬录
# 通过下⾯语句可以打印当前导包路径
print(sys.path)
# 在dev.py⽂件中配置导包路径
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
1.4 注册⼦应⽤
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','userapp',
]
2. 实现展示⽤户注册⻚⾯功能
2.1 在项⽬包⽬录 /templates下 创建基础模板⽂件
2.2 在项⽬包⽬录/templates下 创建userapp⽂件夹
2.3 将 register.html 存放⾄ 项⽬包⽬录/templates/userapp⽬录 下
2.4 创建注册视图
class Register(View):def get(self,request):return render(request,'userapp/register.html')
2.5 定义 ⽤户注册路由
# 项⽬根路由
from django.contrib import admin
from django.urls import path, re_path, includeurlpatterns = [path('admin/', admin.site.urls),re_path('^', include(('userapp.urls', 'userapp',), namespace='userapp')),
]
# ⽤户模块⼦路由
from django.urls import re_path
from . import viewsurlpatterns = [re_path('^register/$', views.Register.as_view(), name='register'),
]
3 Django默认⽤户认证系统
- Django⾃带⽤户认证系统
- 它处理 ⽤户账号、组、权限以及基于cookie的⽤户会话。
- Django认证系统位置
- django.contrib.auth包含 认证框架的核⼼和默认的模型。
- django.contrib.contenttypes是 Django内容类型系统,它允许权限与你创建的模型关联。
- Django认证系统同时处理 认证和授权
- 认证:验证⼀个⽤户是否它声称的那个⼈,可⽤于账号登录。
- 授权:授权决定⼀个通过了认证的⽤户被允许做什么。
- Django认证系统包含的内容
- ⽤户:⽤户模型类、⽤户认证。
- 权限:标识⼀个⽤户是否可以做⼀个特定的任务,MIS系统常⽤到。
- 组:对多个具有相同权限的⽤户进⾏统⼀管理,MIS系统常⽤到。
- 密码:⼀个可配置的密码哈希系统,设置密码、密码校验。
3.1 Django默认⽤户模型类
- Django认证系统中提供了⽤户模型类,User保存⽤户的数据。
- User对象是认证系统的核⼼。
- Django认证系统⽤户模型类位置
- django.contrib.auth.models.User
class User(AbstractUser):"""Users within the Django authentication system are representedby thismodel.Username and password are required. Other fields are optional."""class Meta(AbstractUser.Meta):swappable = 'AUTH_USER_MODEL'
- ⽗类AbstractUser介绍
- User对象基本属性
- 创建⽤户(注册⽤户)必选: username、password
- 创建⽤户(注册⽤户)可选:email、first_name、last_name、last_login、 date_joined、is_active 、is_staff、is_superuse
- 判断⽤户是否通过认证(是否登录):is_authenticated
- 创建⽤户(注册⽤户)的⽅法
user = User.objects.create_user(username, email, password, **extra_fields)
# 源码
def _create_user(self, username, email, password, **extra_fields):"""Create and save a user with the given username, email, andpassword."""if not username:raise ValueError('The given username must be set')email = self.normalize_email(email)username = self.model.normalize_username(username)user = self.model(username=username, email=email, **extra_fields)user.set_password(password)user.save(using=self._db)return userdef create_user(self, username, email=None, password=None, **extra_fields):extra_fields.setdefault('is_staff', False)extra_fields.setdefault('is_superuser', False)return self._create_user(username, email, password,**extra_fields)
- ⽤户认证 (⽤户登录)的⽅法
from django.contrib.auth import authenticate
user = authenticate(username=username, password=password, **kwargs)
- 处理密码的⽅法 设置密码:
- set_password(raw_password)
- 校验密码:check_password(raw_password)
3.2 ⾃定义⽤户模型类
Django⾃带AbstractUser⽤户模型类中没有⼿机号字段。
class Users(AbstractUser):phone = models.CharField(max_length=11, unique=True, verbose_name='⼿机号')class Meta:db_table = 't_user'verbose_name = '⽤户表'verbose_name_plural = verbose_namedef __str__(self):return self.username
3.3 配置Django⽤户模型类
# Django⽤户认证系统中的⽤户模型类
# django.conf下的global_settings.py⽂件中
AUTH_USER_MODEL = 'auth.User'# 配置规则:
# AUTH_USER_MODEL = '应⽤名.模型类名'
# 指定芒果头条项⽬⽤户模型类
AUTH_USER_MODEL = 'userapp.Users'
3.4 迁移⽤户模型类
注意:如果迁移⾃定义⽤户模型类,必须先配置 AUTH_USER_MODEL
# 1.创建迁移⽂件
$ python manage.py makemigrations userapp
# 2.执⾏迁移⽂件
$ python manage.py migrate
4 用户注册功能接口设计
4.1 ⽤户注册业务逻辑分析
4.2 ⽤户注册接⼝设计和定义
- 对于接⼝的设计,我们要根据具体的业务逻辑,设计出适合业务逻辑的接⼝。
- 设计接⼝的思路:
- 分析要实现的业务逻辑:
- 明确在这个业务中涉及到⼏个相关⼦业务。
- 将每个⼦业务当做⼀个接⼝来设计。
- 分析接⼝的功能任务,明确接⼝的访问⽅式与返回数据:
- 请求⽅法(如GET、POST、PUT、DELETE等)。
- 请求地址。
- 请求参数(如路径参数、查询字符串、表单、JSON等 )。
- 响应数据(如HTML、JSON等)。
- 分析要实现的业务逻辑:
4.3 ⽤户注册接⼝设计
- 请求⽅式
- 请求⽅法:POST
- 请求地址:/register/
- 请求参数(表单参数)
- 响应结果 :
- html register.html
4.4 ⽤户注册接⼝定义
- 创建⽤户注册视图
class RegisterView(View):"""⽤户注册"""def get(self, request):"""提供注册界⾯:param request: 请求对象:return: 注册界⾯"""return render(request, 'register.html')def post(self, request):"""实现⽤户注册:param request: 请求对象:return: 注册结果"""pass
- 配置路由
# 项⽬根路由
from django.contrib import admin
from django.urls import path, re_path, includeurlpatterns = [path('admin/', admin.site.urls),re_path('^', include(('userapp.urls', 'userapp',), namespace='userapp')),
]
# 应⽤⼦路由
# userapp/urls.py
from django.urls import re_path
from . import viewsurlpatterns = [re_path('^register/$', views.Register.as_view(), name='register'),
]