美多商城项目之用户登录页面后端实现
首先,我们需要进行业务逻辑分析。
通过上图,我们可以知道,用户登录界面的后端流程,如下:
1. 接收前端传递的参数
2. 校验参数
3. 核心逻辑
4. 返回响应结果
其核心逻辑主要为:
判断前端传递的手机号或用户名是否存在MySQL数据库中,
1. 如果存在,则校验密码是否正确、
1.1 如果密码正确,则设置状态保持。
1.2 如果密码不正确,则响应用户名或密码错误
2. 如果不存在,则响应账号不存在
既然我们明确了核心的逻辑,那么接下来我们就用代码说话吧。
class LoginView(View): def get(self, request): """提供用户登录页面""" return render(request, 'login.html') def post(self, request): """实现用户登录逻辑""" # 接收参数 username = request.POST.get('username') password = request.POST.get('password') remembered = request.POST.get('remembered') # 校验参数 # 判断参数是否齐全,remembered是可选的 if not all([username, password]): return http.HttpResponseForbidden('缺少必传参数') # 判断用户名是否是5-20个字符 if not re.match(r'^[a-zA-Z0-9_-]{5,20}$', username): return http.HttpResponseForbidden('请输入正确的用户名或手机号') # 判断密码是否是8-20个数字 if not re.match(r'^[0-9A-Za-z]{8,20}$', password): return http.HttpResponseForbidden('密码最少8位,最长20位') # 认证用户 user = authenticate(request, username=username, password=password) if not user: return render(request, 'login.html', {'account_errmsg': '账号或密码错误'}) # 状态保持 login(request, user) # 根据用户是否记住登录来设置状态保持的生命周期 if remembered != 'on': # 不记住登录:浏览器会话结束后状态保持销毁,设置session的有效期为0秒 request.session.set_expiry(0) else: # 记住登录:状态保持为两周,如果传入None,默认两周 request.session.set_expiry(None) # 登录成功后重定向到其他页面 next = request.GET.get('next') if next: # 跳转到next对应的页面 response = redirect(next) else: # # 跳转到首页 response = redirect(reverse('contents:index')) # 登录成功之后,响应之前,用户名写入到cookie response.set_cookie('username', user.username, max_age=3600*24*7) # 响应结果 return response
该花的钱要花,该吃的饭要吃。