首先,咱们须要进行业务逻辑分析。html
经过上图,咱们能够知道,用户登陆界面的后端流程,以下:前端
1. 接收前端传递的参数数据库
2. 校验参数后端
3. 核心逻辑浏览器
4. 返回响应结果cookie
其核心逻辑主要为:session
判断前端传递的手机号或用户名是否存在MySQL数据库中,post
1. 若是存在,则校验密码是否正确、spa
1.1 若是密码正确,则设置状态保持。code
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