用户注册模块用户校验(头条项目-05)

1 用户注册后端逻辑

1.1 接收参数

python 复制代码
username = request.POST.get('username')
password = request.POST.get('password')
phone = request.POST.get('phone')

1.2 校验参数

前端校验过的后端也要校验,后端的校验和前端的校验是⼀致的

python 复制代码
# 判断参数是否⻬全
# 判断⽤户名是否是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() ⽅法加密密码。
python 复制代码
# 保存注册数据
try:
    Users.objects.create_user(username=username, password=password,
                              phone=phone)
except DatabaseError:
    return render(request, 'register.html', {'register_errmsg': '注
                                             册失败'})
    # 响应注册结果
return http.HttpResponse('注册成功,重定向到⾸⻚')

如果注册失败,我们需要在⻚⾯上 渲染出注册失败的提示信息

html 复制代码
<h5 class="title-login">⽤户注册
    {% if register_error %}
    <span class="error-tip">{{ register_error }}</span>
    {% endif %}
</h5>

1.4 响应注册结果

重要提示:注册成功,重定向到⾸⻚

1.4.1 创建newsapp⼦应⽤
bash 复制代码
$ cd apps
$ python ../../manage.py startapp newsapp

这行命令的作用是在Django项目的根目录下创建一个名为**newsapp的新应用程序**,并生成基本的文件结构。这样你就 可以开始在这个应用程序中定义模型、视图、模板等,以构建你的Web应用。

1.4.2 定义⾸⻚视图
python 复制代码
class NewsView(View):
    def get(self, request):
        return render(request, 'index.html')
1.4.3 配置路由
python 复制代码
# 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()位置
python 复制代码
# django.contrib.auth.__init__.py⽂件中。
login(request, user, backend=None)
2.1.4 状态保持 session

数据存储的位置:Redis数据库的1号库

python 复制代码
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "session"

2.2login()⽅法登⼊⽤户

python 复制代码
# 保存注册数据
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 ⻚⾯获取当前会话值

html 复制代码
<ul class="header-user-links">
    {% if user %}
    欢迎您! <span style="font-weight: bolder;">[ {{
    user.username }} ]</span>
    &emsp;<a href="/logout/">退出登录</a>&nbsp;
    {% else %}
    <li>
        <a href="/login/">登录</a>&nbsp;&nbsp;&nbsp;
        <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 ⽤户名重复注册后端逻辑

python 复制代码
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 ⽤户名重复注册前端逻辑

javascript 复制代码
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

html 复制代码
<ul class="header-user-links">
    {% if user.username %}
    欢迎您! <span style="font-weight: bolder;">[ {{ user.username }} ]</span>
    &emsp;<a href="/logout/">退出登录</a>&nbsp;
    {% else %}
    <li>
        <a href="/login/">登录</a>&nbsp;&nbsp;&nbsp;
        <a href="/register/">注册</a>
    </li>
    {% endif %}
</ul>

4.2 配置路由

python 复制代码
# 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 创建视图

python 复制代码
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 ⼿机号重复注册 端逻辑

python 复制代码
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 ⼿机号重复注册 前端逻辑

javascript 复制代码
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);
        })
)
相关推荐
Mr.Jessy3 小时前
JavaScript高级:构造函数与原型
开发语言·前端·javascript·学习·ecmascript
白兰地空瓶5 小时前
🚀你以为你在写 React?其实你在“搭一套前端操作系统”
前端·react.js
哥本哈士奇(aspnetx)5 小时前
Streamlit + LangChain 1.0 简单实现智能问答前后端
python·大模型
爱上妖精的尾巴5 小时前
6-4 WPS JS宏 不重复随机取值应用
开发语言·前端·javascript
似水流年QC6 小时前
深入探索 WebHID:Web 标准下的硬件交互实现
前端·交互·webhid
我一定会有钱6 小时前
斐波纳契数列、end关键字
python
陪我去看海6 小时前
测试 mcp
前端
speedoooo6 小时前
在现有App里嵌入一个AI协作者
前端·ui·小程序·前端框架·web app
全栈胖叔叔-瓜州6 小时前
关于llamasharp 大模型多轮对话,模型对话无法终止,或者输出角色标识User:,或者System等角色标识问题。
前端·人工智能
小鸡吃米…7 小时前
Python 列表
开发语言·python