1 用户注册后端逻辑
1.1 接收参数
username = request.POST.get('username')
password = request.POST.get('password')
phone = request.POST.get('phone')
1.2 校验参数
前端校验过的后端也要校验,后端的校验和前端的校验是⼀致的
# 判断参数是否⻬全
# 判断⽤户名是否是5-8位字符
# 判断密码是否是3-8位字符
# 判断⼿机号是否合法
# 判断参数是否⻬全
if not all([username, password, phone]):
raise Forbbiden('缺少必传参数')
# 判断⽤户名是否是5-8个字符
if not re.match(r'^[a-zA-Z][a-zA-Z0-9_]{4,7}$', username):
raise Forbbiden('请输⼊5-8个字符的⽤户名')
# 判断密码是否是3-8个字符
if not re.match(r'^[0-9a-zA-Z]{3,8}$', password):
raise Forbbiden('请输⼊3-8位的密码')
# 判断⼿机号是否合法
if not re.match(r'^1[3589]\d{9}$', phone):
raise Forbbiden('请输⼊正确的⼿机号码')
提示:这⾥校验的参数,前端已经校验过,如果此时参数还是出错,说明该请求是 ⾮正常渠道发送的,所以直接禁⽌本次请求。
1.3 保存注册数据
- 这⾥使⽤Django认证系统⽤户模型类提供的 create_user() ⽅法创建新的⽤户。 .
- 这⾥ create_user() ⽅法中封装了 set_password() ⽅法加密密码。
# 保存注册数据
try:
Users.objects.create_user(username=username, password=password,
phone=phone)
except DatabaseError:
return render(request, 'register.html', {'register_errmsg': '注
册失败'})
# 响应注册结果
return http.HttpResponse('注册成功,重定向到⾸⻚')
如果注册失败,我们需要在⻚⾯上 渲染出注册失败的提示信息。
<h5 class="title-login">⽤户注册
{% if register_error %}
<span class="error-tip">{{ register_error }}</span>
{% endif %}
</h5>
1.4 响应注册结果
重要提示:注册成功,重定向到⾸⻚
1.4.1 创建newsapp⼦应⽤
$ cd apps
$ python ../../manage.py startapp newsapp
这行命令的作用是在Django项目的根目录下创建一个名为 newsapp
的新应用程序,并生成基本的文件结构。这样你就 可以开始在这个应用程序中定义模型、视图、模板 等,以构建你的Web应用。
1.4.2 定义⾸⻚视图
class NewsView(View):
def get(self, request):
return render(request, 'index.html')
1.4.3 配置路由
# 1. 配置总路由
from django.contrib import admin
from django.urls import path, re_path, include
urlpatterns = [
path('admin/', admin.site.urls),
re_path('^', include(('userapp.urls', 'userapp',), namespace='userapp')),
re_path('^', include(('newsapp.urls', 'newsapp',), namespace='newsapp')),
]
# 2. 配置⼦路由
from django.urls import re_path
from . import views
urlpatterns = [
re_path('^$', views.NewsView.as_view(), name='index'),
]
# # 3. 启动服务器,测试⾸⻚
# http://127.0.0.1:8000/
# 4. 响应注册结果:重定向到⾸⻚
return redirect(reverse('newsapp:index'))
1.5 知识要点
1 后端逻辑编写套路:
- 业务逻辑分析
- 接⼝设计和定义
- 接收和校验参数
- 实现主体业务逻辑
- 响应结果
2 注册业务逻辑核⼼思想:
- 保存⽤户注册数据
2 用户注册状态保持
说明:
- 如果需求是注册成功后即表示⽤户登⼊成功,那么此时可以在注册成功后实现状态保持
- 如果需求是注册成功后不表示⽤户登⼊成功,那么此时不⽤在注册成功后实现状态保持
- 芒果头条的需求是:注册成功后即表示⽤户登⼊成功
2.1 login()⽅法介绍
2.1.1 ⽤户登⼊本质
- 状态保持
- 将通过认证的⽤户的唯⼀标识信息(⽐如:⽤户ID)写⼊到当前浏览器的 cookie 和服务端的 session 中。
2.1.2 login()⽅法
- Django⽤户认证系统提供了login()⽅法。
- 封装了写⼊session的操作,帮助我们 快速登⼊⼀个⽤户,并实现状态保持。
2.1.3 login()位置
# django.contrib.auth.__init__.py⽂件中。
login(request, user, backend=None)
2.1.4 状态保持 session
数据存储的位置:Redis数据库的1号库
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "session"
2.2 login()⽅法登⼊⽤户
# 保存注册数据
try:
user = Users.objects.create_user(username=username,
password=password, phone=phone)
except DatabaseError:
return render(request, 'register.html', {'register_error': '注册失败'})
# 登⼊⽤户,实现状态保持
login(request, user)
# 响应注册结果
return redirect(reverse('newsapp:index'))
2.3 ⻚⾯获取当前会话值
<ul class="header-user-links">
{% if user %}
欢迎您! <span style="font-weight: bolder;">[ {{
user.username }} ]</span>
 <a href="/logout/">退出登录</a>
{% else %}
<li>
<a href="/login/">登录</a>
<a href="/register/">注册</a>
</li>
{% endif %}
</ul>
3 用户名重复注册校验
3.1 ⽤户名重复注册接⼝设计和定义
3.1.1 请求⽅式
选项 | ⽅案 |
请求⽅法 | GET |
请求地址 1 | /usernames/(?P[a-zA-Z0-9_-]{5,8})/count/ |
3.1.2 请求参数:路径参数
参数名 | 类型 | 是否必传 | 说明 |
username | string | 是 | ⽤户名 |
3.1.3 响应结果:JSON
响应结果 | 响应内容 |
code | 状态码 |
errmsg | 错误信息 |
count | 记录该⽤户名的个数 |
3.2 ⽤户名重复注册后端逻辑
class UnameCountView(View):
"""判断⽤户名是否重复注册"""
def get(self, request, username):
"""
:param request: 请求对象
:param username: ⽤户名
:return: JSON
"""
count = Users.objects.filter(username=username).count()
return http.JsonResponse({'code': 200, 'errmsg': 'OK',
'count': count})
3.3 ⽤户名重复注册前端逻辑
if (this.error_username == false) {
axios.get('/usernames/' + this.username + '/count/', {
responseType: 'json'
})
.then(response => {
if (response.data.count == 1) {
this.error_username_msg = '⽤户名已存在';
this.error_username = true;
} else {
this.error_username = false;
}
})
.catch(error => {
console.log(error.response);
})
}
3.4 知识要点
1 判断⽤户名重复注册的核⼼思想:
- 使⽤⽤户名查询对应的记录是否存在,如果存在,表示重复注册,反之,没有重复注册。
2 axios发送异步请求套路:
- 处理⽤户交互
- 收集请求参数
- 准备请求地址
- 发送异步请求
- 得到服务器响应
- 控制界⾯展示效果
4 用户退出登录
4.1 修改base.html
<ul class="header-user-links">
{% if user.username %}
欢迎您! <span style="font-weight: bolder;">[ {{ user.username }} ]</span>
 <a href="/logout/">退出登录</a>
{% else %}
<li>
<a href="/login/">登录</a>
<a href="/register/">注册</a>
</li>
{% endif %}
</ul>
4.2 配置路由
# userapp/urls.py
from django.urls import path, re_path
from . import views
urlpatterns = [
re_path('^register/$', views.RegisterView.as_view()),
re_path('^usernames/(?P<username>[a-zA-Z_]{5,8})/count/$',
views.UsernameCount.as_view()),
re_path('^logout/$', views.LogoutView.as_view())
]
4.3 创建视图
class LogoutView(View):
def get(self, request):
"""
⽤户退出登录
:param request:
:return:
"""
logout(request)
return redirect(reverse('newsapp:index'))
5 用户手机号重复注册校验
5.1 ⼿机号重复注册接⼝设计和定义
5.1.1 请求⽅式
选项 | ⽅案 |
请求⽅法 | GET |
请求地址 | /phones/(?P1[3589][0-9]{9})/count/ |
5.1.2 请求参数:路径参数
参数名 | 类型 | 是否必传 | 说明 |
mobile | string | 是 | ⼿机号 |
5.1.3 响应结果:JSON
响应结果 | 响应内容 |
code | 状态码 |
errmsg | 错误信息 |
count | 记录该⽤户名的个数 |
5.2 ⼿机号重复注册 后端逻辑
class PhoneCountView(View):
"""判断⼿机号是否重复注册"""
def get(self, request, phone):
"""
:param request: 请求对象
:param phone: ⼿机号
:return: JSON
"""
count = Users.objects.filter(phone=phone).count()
return http.JsonResponse({'code': 200, 'errmsg': 'OK',
'count': count})
5.3 ⼿机号重复注册 前端逻辑
if (this.error_phone == false) {
let url = '/phones/' + this.phone + '/count/';
axios.get(url, {
responseType: 'json'
})
.then(response => {
if (response.data.count == 1) {
this.error_phone_msg = '⼿机号已存在';
this.error_phone = true;
} else {
this.error_phone = false;
}
})
.catch(error => {
console.log(error.response);
})
)