首页 > 技术文章 > 美多商城项目之用户登录页面后端实现

chao666 2020-01-13 21:19 原文

首先,我们需要进行业务逻辑分析。

 

 通过上图,我们可以知道,用户登录界面的后端流程,如下:

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

推荐阅读