美多商城项目之用户注册页面后端开发流程简介
首先,我们需要明白后端开发的流程:
1. 接收参数
2. 校验参数
3. 实现核心逻辑
4. 响应数据
后端开法的流程是不会改变的,会改变的只有核心逻辑和响应数据的方式。
拿到这个任务时,我们首先要做的就是,阅读开发文档。
根据开发文档判断出前端通过什么方式发送的请求,并且传递了那些数据,通过什么方式讲这些数据传递给我们的。
通过以上项目开发报告,我们可以得出,前端是通过POST请求向我们传递的表单数据,并且我们也知道了传递数据都有些什么,以及我们应该响应什么数据给前端。
那么,接下我们需要进行业务逻辑的分析,我们要知道注册业务的主要逻辑是什么。
通过业务逻辑分析,我们明确了用户注册业务的核心逻辑就是将接收到的数据保存到MySQL数据库中,并且设置状态保持。
以上,我们就完成了用户注册后端逻辑开发的所有准备工作。
接下来,我们就需要通过代码实现了。
首先,我们需要确定的是我们既然需要将数据保存到数据库中,那么我们就一定需要一个模型类model用来定义数据库中的数据表,以及方便以后在Django程序中操作数据库。
1. 创建子应用,并注册。
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', # 以下:注册子应用 'apps.users', 'apps.oauth', ]
注意:
当子应用中不需要进行数据库迁移或渲染模板时不需要进行注册,但如果子应用中需要进行数据库迁移或渲染模板那么一定要注册应用,否则会出现致命错误(非常傻逼的错误,很low...)。
2. 定义用户模型类,并执行数据库迁移。
在定义用户模型类时,我们需要知道Django框架自己给我们带了一个用户模型类(AbstractUser),这个自带的模型类可以满足我们的一些基本需求,但不能满足我们的全部需求。
当出现这种情况时,我们就需要自定义用户模型类,用来完成自带的模型类的功能扩充,说到类功能的扩充自然而然的就能联想到类继承,我们就通过类继承来完成对Django框架自带的用户模型类(AbstractUser)进行扩充。
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
class User(AbstractUser):
mobile = models.CharField(max_length=11,unique=True,verbose_name='手机号')
email_active = models.BooleanField(default=False, verbose_name='邮箱状态')
class Meta:
db_table = 'tb_users'
verbose_name = '用户'
verbose_name_plural = verbose_name
在执行数据库迁移之前需要将Django项目的默认用户模型类修改成我们自定义的模型类,否则将出现一下错误:
ERRORS: auth.User.groups: (fields.E304) Reverse accessor for 'User.groups' clashes with reverse accessor for 'User.groups'. HINT: Add or change a related_name argument to the definition for 'User.groups' or 'User.groups'. auth.User.user_permissions: (fields.E304) Reverse accessor for 'User.user_permissions' clashes with reverse accessor for 'User.user_permissions'. HINT: Add or change a related_name argument to the definition for 'User.user_permissions' or 'User.user_permissions'. user.User.groups: (fields.E304) Reverse accessor for 'User.groups' clashes with reverse accessor for 'User.groups'. HINT: Add or change a related_name argument to the definition for 'User.groups' or 'User.groups'. user.User.user_permissions: (fields.E304) Reverse accessor for 'User.user_permissions' clashes with reverse accessor for 'User.user_permissions'. HINT: Add or change a related_name argument to the definition for 'User.user_permissions' or 'User.user_permissions'.
拯救方式就是:
# 修改默认的用户模型类 # AUTH_USER_MODEL = 'auth.User' # Django默认的配置 # AUTH_USER_MODEL = '子应用.用户模型类' # 配置的语法 AUTH_USER_MODEL = 'users.User' # 配置的语法
数据库迁移命令:
# 生成数据库迁移文件
python manage.py makemigrations
# 执行数据库迁移文件
python manage.py migrate
当我们完成用户模型类以后,我们要做的就是要实现后端的逻辑了。
用户注册页面的后端逻辑介绍:
1. 定义视图接口
我们项目使用的是面型对象的思想进行编写的,所以我们需要定义的是类视图,类视图的具体特性我就不阐述了。
class RegisterView(View):
def get(self, resquest):
''' 当用户通过GET方式请求时执行此方法 '''
return render(resquest,'register.html') # 返回jinja2模版
def post(self,request):
''' 当用户通过POST方式请求时执行此方法 '''
# 接收前端传递的表单参数
username = request.POST.get('username')
password = request.POST.get('password')
password2 = request.POST.get('password2')
mobile = request.POST.get('mobile')
allow = request.POST.get('allow')
# 校验参数
# 后端校验数据需要和前端一致
if not all([username,password,password2,mobile,allow]):
return http.HttpResponseForbidden('缺少参数')
if not re.match(r'^[a-zA-Z0-9_-]{5,20}$',username):
return http.HttpResponseForbidden('用户名错误')
if not re.match(r'^[0-9A-Za-z]{8,20}$',password):
return http.HttpResponseForbidden('密码错误')
if password != password2:
return http.HttpResponseForbidden('两次密码不一致')
if not re.match(r'^1[3-9]\d{9}$',mobile):
return http.HttpResponseForbidden('手机号错误')
if allow != 'on':
return http.HttpResponseForbidden('没勾选协议')
try:
# 保存数据到数据库
user = User.objects.create_user(username=username,password=password,mobile=mobile)
except DatabaseError:
return render(request,'register.html',{'error_msg':'注册失败!'})
# 设置状态保持
login(request, user)
# 定义一个响应对象
resp = redirect(reverse('contents:index'))
# 设置cookie为前端显示用户名提供数据支持
resp.set_cookie('username',user.username,max_age=3600 * 24 * 14)
return resp
注意:
后端校验数据的逻辑必须大于等于前端的校验逻辑;
all([‘val1’,....]):当列表中数据都有值时为True,当列表中数据其中有一个没有值时为False;
操作数据库时必须捕获异常,并处理异常,不能将异常暴露给用户,否则会降低用户体验;
设置状态保持:login(request, user) ---> 设置session数据 ---> 登录;
清除状态保持:logout(request) ---> 清除session数据 ---> 退出。
2. 配置路由
配置路由的目的是为了让用户能够请求到当前视图接口。
from django.conf.urls import url
from apps.users import views
urlpatterns = [
# 配置用户注册页面路由信息
url(r'^register/$', views.RegisterView.as_view(),name='register'),
]
注意:
子路由配置完毕后,需要将子路由在主路由中进行注册,否则用户依旧无法请求到视图接口。
以上,我们用户注册页面的后端流程就介绍完毕了。
对了,记得使用Git命令push,否则就更死亡了。