Django商城项目注册功能的实现
本文详细解析Django商城项目中注册功能的实现过程。前端采用Vue.js实现数据双向绑定与实时表单校验,包括用户名、密码及手机号的格式验证。后端通过Django视图类处理注册请求,利用Django内置login方法实现用户会话保持,并将Session存储于Redis。文章涵盖从前端交互设计到后端业务逻辑的完整代码实现与配置说明。
涉及的前端技术知识
本项目前端页面采用Vue框架实现局部刷新,利用数据双向绑定机制与用户进行交互。具体需求如下:当用户输入内容后,前端需执行基础规则校验,并在用户输入过程中实时检测,若发现错误,需在输入框下方即时显示错误提示信息。
<li>
<label>用户名:</label>
<input type="text" name="username" id="user_name">
<span class="error_tip">请输入5-20个字符的用户</span>
</li>
<li>
<label>密码:</label>
<input type="password" name="password" id="pwd">
<span class="error_tip">请输入8-20位的密码</span>
</li>
以用户名和密码输入框为例,当用户完成用户名输入并移开光标时,系统需实时检测输入内容的合法性。若输入存在格式问题,则在输入框下方展示相应的错误信息。
代码中使用了v-model实现数据双向绑定,通过v-on进行事件绑定,并利用v-show控制DOM元素的显示与隐藏。以下是集成Vue后的部分关键代码片段。
<li>
<label>用户名:</label>
<input type="text" name="username" id="user_name" v-model="username" @blur="check_username">
<span class="error_tip" v-show="error_name">[[error_name_message]]</span>
</li>
<li>
<label>密码:</label>
<input type="password" name="password" id="pwd" v-model="password" @blur="check_password">
<span class="error_tip" v-show="error_password">请输入8-20位的密码</span>
</li>
用户输入的用户名与username变量进行绑定,当光标离开输入框时触发绑定的check_username事件。通过v-show指令绑定到布尔型变量error_name,从而控制字符串变量error_name_message的显示状态。其他输入框的处理逻辑与此类似。
注册业务逻辑实现
前端注册业务逻辑处理
注册表单相关代码结构如下:
<form method="post" class="register_form" >
{{ csrf_input }}
<ul>
<li>
<label>用户名:</label>
<input type="text" name="username" id="user_name" v-model="username" @blur="check_username">
<span class="error_tip" v-show="error_name">[[error_name_message]]</span>
</li>
<li>
<label>密码:</label>
<input type="password" name="password" id="pwd" v-model="password" @blur="check_password">
<span class="error_tip" v-show="error_password">请输入8-20位的密码</span>
</li>
<li>
<label>确认密码:</label>
<input type="password" v-model="password2" @blur="check_password2" name="password2"
id="cpwd">
<span class="error_tip" v-show="error_password2">两次输入的密码不一致</span>
</li>
<li>
<label>手机号:</label>
<input type="text" v-model="mobile" @blur="check_mobile" name="mobile" id="phone">
<span class="error_tip" v-show="error_mobile">[[ error_mobile_message ]]</span>
</li>
<li>
<label>图形验证码:</label>
<input type="text" name="image_code" id="pic_code" class="msg_input">
<img src="{{ static('images/pic_code.jpg') }}" alt="图形验证码" class="pic_code">
<span class="error_tip">请填写图形验证码</span>
</li>
<li>
<label>短信验证码:</label>
<input type="text" name="sms_code" id="msg_code" class="msg_input">
<a href="javascript:;" rel="external nofollow" class="get_msg_code">获取短信验证码</a>
<span class="error_tip">请填写短信验证码</span>
</li>
<li class="agreement">
<input type="checkbox" name="allow" id="allow" v-model="allow" @change="check_allow">
<label>同意”商城用户使用协议“</label>
<span class="error_tip" v-show="error_allow">请勾选用户协议</span>
</li>
<li class="reg_sub">
<input type="submit" value="注 册" @change="on_submit">
{% if register_errmsg %}
<span class="error_tip2">{{ register_errmsg }}</span>
{% endif %}
</li>
</ul>
</form>
需要导入vue.js库以及用于发起Ajax请求的js库。
<script type="text/javascript" src="{{ static('js/vue-2.5.16.js') }}"></script>
<script type="text/javascript" src="{{ static('js/axios-0.18.0.min.js') }}"></script>
准备名为register.js的文件。
register.js文件主要负责处理注册页面的交互事件,并向服务端提交注册表单请求。
<script type="text/javascript" src="{{ static('js/register.js') }}"></script>
以下是实现的前端校验逻辑以及表单提交逻辑的具体代码。
methods: {
// 校验用户名
check_username() {
let re = /^[a-zA-Z0-9_-]{5,20}$/;
if (re.test(this.username)) {
this.error_name = false;
} else {
this.error_name_message = '请输入5-20个字符的用户名';
this.error_name = true;
}
},
// 校验密码
check_password() {
let re = /^[0-9A-Za-z]{8,20}$/;
this.error_password = !re.test(this.password);
},
// 校验确认密码
check_password2() {
if (this.password !== this.password2) {
this.error_password2 = true;
} else {
this.error_password2 = false;
}
},
// 校验手机号
check_mobile() {
let re = /^1[3-9]\d{9}$/;
if (re.test(this.mobile)) {
this.error_mobile = false;
} else {
this.error_mobile_message = '您输入的手机号格式不正确';
this.error_mobile = true;
}
},
// 校验是否勾选协议
check_allow() {
this.error_allow = !this.allow;
},
// 监听表单提交事件
on_submit() {
this.check_username();
this.check_password();
this.check_password2();
this.check_mobile();
this.check_allow();
# 输入字段中有一个不符合规则就禁止
if (this.error_name === true || this.error_password === true || this.error_password2 === true
|| this.error_mobile === true || this.error_allow === true) {
// 禁用表单的提交
window.event.returnValue = false;
}
},
}
后端业务注册逻辑处理
在用户输入用户名后,通常希望尽快得知该用户名是否符合注册要求。此前仅对用户名格式进行了校验,还需确认该用户名是否已在系统中存在。若等到用户提交完整注册信息后才提示用户名或手机号已注册,用户体验较差。因此,需在光标离开用户名输入框时请求服务端,判断该用户名是否已被注册。
定义相关路由规则。
path('register/', views.RegisterView.as_view(), name='register'), # name添加命名空间
path('usernames/<str:username>', views.UsernameCountView.as_view(), name="username"),
re_path(r'mobiles/(?P<mobile>1[3-9]\d{9})', views.MobileCountView.as_view(), name='mobile')
编写对应的视图类。
class UsernameCountView(View):
def get(self, request, username):
"""
查询该用户名是否在系统中存在
:param request: 请求对像
:param username: 前端传递的用户名
:return:
"""
count = User.objects.filter(username=username).count()
return http.JsonResponse({'code':1001, 'msg':'用户已存在'}) if count == 1 \
else http.JsonResponse({'code': 1000, 'msg': ''})
此处未对响应结果进行统一处理封装,后续将专门介绍相关内容。
接下来是注册视图类的具体编写代码。
class RegisterView(View):
"""用户注册视图类"""
def get(self, request):
'''获取注册页面'''
return render(request, 'register.html')
def post(self, request):
""""""
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('缺少必传参数')
# 判断用户名是否是5-20个字符
if not re.match(r'^[a-zA-Z0-9_-]{5,20}$', username):
return http.HttpResponseForbidden('请输入5-20个字符的用户名')
# 判断密码是否是8-20个数字
if not re.match(r'^[0-9A-Za-z]{8,20}$', password):
return http.HttpResponseForbidden('请输入8-20位的密码')
# 判断两次密码是否一致
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 as e:
return render(request, 'register.html', {'register_errmsg': e.args})
# 注册成功保存会话
login(request, user)
return redirect(reverse('contents:index'))
Django提供的login方法封装了写入session的操作,旨在帮助用户快速登录并实现状态保持。该方法将通过认证的用户的唯一标识信息(例如:用户ID)写入到当前浏览器的cookie和服务端的session中。
request.session[SESSION_KEY] = user._meta.pk.value_to_string(user)
request.session[BACKEND_SESSION_KEY] = backend
request.session[HASH_SESSION_KEY] = session_auth_hash
Session数据将存入Redis,这需要在工程创建时进行相应的Session存储配置。
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "session"
链接: https://pan.baidu.com/s/1dFliI6KkNubd4k_OTEpqDA 提取码: h3dp
以上即为Django商城项目注册功能实现的详细内容,更多关于Django注册功能的资料请持续关注本站其他相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









