美文网首页程序员Django
Django的登录功能(六)

Django的登录功能(六)

作者: 测试游记 | 来源:发表于2019-03-02 10:14 被阅读7次

    勾选同意协议的校验

    发现上一篇里面忘了对勾选我同意协议的校验了。虽然也没啥协议,但是样子还是要做一下的。
    找到register.html里面的对应区域:

    <div class="form-group">
        <label>
            <input type="checkbox" name="aggree" value="1"> 我同意协议
        </label>
    </div>
    

    它的name是aggree。我们继续打上断点来进行测试一下,传输的过程中它去哪里了。

    断点
    在页面上输入内容后点击注册按钮
    调试模式
    从图中可以看到aggree字段。同理测试一下不勾选之后的传输内容:
    不勾选的调试
    可以看到压根就没了这个字段了。所以我们的判断就是有没有这个字段好了。加上点容错处理使用字典的get好了
    if not request.POST.get('aggree'):
        return to_json_data(errno=Code.AGGREE,errmsg=error_map[Code.AGGREE])
    

    以上我们完成了初步的注册功能。但是其中肉眼可见的很多bug。这些问题在后续的自测中在进行修改好了。

    登录功能

    下面来写登录功能了,不过写之前先写一下登录完成之后的页面,不然登录到哪里去?
    写一个简单的index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>接口测试平台</title>
    </head>
    <body>
    
    </body>
    </html>
    

    这个先挖个坑好了,之后具体的内容再进行替换。
    先来实现LoginViewpost请求
    我们要完成一个登录需要进行如下几步:

    • 获取前端返回的参数
    • 校验参数
    • 用户登录,设置会话信息
    • 返回前端
      因为使用了csrf中间件进行post传输校验,所以在登录页面加上{% csrf_token %}
      加入的位置和注册一样,在form表单内部
      csrf校验

    获取前端返回的参数

    下面是后端代码的编写。
    首先是和注册一样的获取前端传输的内容:

      def post(self,request):
            try:
                json_data = request.POST
                if not json_data:
                    return to_json_data(errno=Code.PARAMERR, errmsg="参数为空,请重新输入")
                dict_data = json.loads(json_data.decode('utf8'))
            except Exception as e:
                logging.info('错误信息:\n{}'.format(e))
                return to_json_data(errno=Code.UNKOWNERR, errmsg=error_map[Code.UNKOWNERR])
    

    同样使用断点来查看传输的内容


    登录POST请求

    校验参数

    看样子没问题,然后进行内容的校验。需要和数据库进行比对
    这次同样采用form校验

    class LoginForm(forms.Form):
        """
        login form data
        """
        email = forms.EmailField()
        password = forms.CharField(label='密码', max_length=20, min_length=6,
                                   error_messages={"min_length": "密码长度要大于6", "max_length": "密码长度要小于20",
                                                   "required": "密码不能为空"}
                                   )
        remember_me = forms.BooleanField(required=False)
    
        def __init__(self, *args, **kwargs):
            """
    
            :param args:
            :param kwargs:
            """
            self.request = kwargs.pop('request', None)
            super(LoginForm, self).__init__(*args, **kwargs)
    
        def clean(self):
            """
    
            :return:
            """
            # 1.获取清洗之后的参数
            cleanded_data = super().clean()
            user_info = cleanded_data.get('email')
            passwd = cleanded_data.get('password')
            hold_login = cleanded_data.get('remember')
            # 2.查询数据库,判断用户账号和密码是否正确
            user_queryset = User.objects.filter(Q(email=user_info))
            if user_queryset:
                user = user_queryset.first()
                if user_queryset.get(password=passwd):
                    # 3.是否将用户信息设置到会话中
                    if hold_login:
                        self.request.session.set_expiry(constants.USER_SESSION_EXPIRES)
                    else:
                        self.request.session.set_expiry(0)  # 关闭浏览器清空
                else:
                    raise forms.ValidationError('用户密码有误,请重新输入!')
            else:
                raise forms.ValidationError('用户账号不存在,请重新输入!')
    

    本段代码中比较重要的是:clean函数

    cleanded_data = super().clean()
    user_info = cleanded_data.get('email')
    passwd = cleanded_data.get('password')
    hold_login = cleanded_data.get('remember')
    

    通过这几行代码拿到了具体的内容,例如
    user_info就是前端填写的email;
    passwd是前端填写的密码;
    hold_login是前端的勾选记住我;
    之后在数据库查询是否存在这个email
    user_queryset = User.objects.filter(Q(email=user_info))
    如果存在那么就进行密码的校验
    user_queryset.get(password=passwd)
    如果密码也对了,那就记录会话信息。

    用户登录,设置会话信息

    使用self.request.session.set_expiry设置会话保存的时长。

    # 用户session信息过期时间,单位秒,这里设置为5天
    USER_SESSION_EXPIRES = 5 * 24 * 60 * 60
    
    cookie
    cookie
    从图片可以看出会话的保持时间是到浏览器关闭为止。
    这与我们的计划有点出路了,我们的配置应该是能保存5天的呀!
    通过断点检查一下代码
    断点
    发现hold_login拿的的是None,往上翻一下原来是name与forms中的命名不一致
    修改这一行:remember = forms.BooleanField(required=False)
    再次测试
    查看新的过期时间:
    过期时间

    后端代码

    以下是post相关部分的代码。

      def post(self, request):
            try:
                json_data = request.POST
                if not json_data:
                    return to_json_data(errno=Code.PARAMERR, errmsg="参数为空,请重新输入")
                use_key = [ "email","password", "remember"]
                dict_data = {}
                for i in use_key:
                    dict_data[i] = request.POST.get(i)
            except Exception as e:
                logging.info('错误信息:\n{}'.format(e))
                return to_json_data(errno=Code.UNKOWNERR, errmsg=error_map[Code.UNKOWNERR])
            form = LoginForm(data=dict_data, request=request)
            if form.is_valid():
                return render(request,'index/index.html')
            else:
                err_msg_list = []
                for item in form.errors.get_json_data().values():
                    err_msg_list.append(item[0].get('message'))
                err_msg_str = '/'.join(err_msg_list)
                return to_json_data(errno=Code.PARAMERR, errmsg=err_msg_str)
    

    欢迎查阅源码:(https://github.com/zx490336534/Zxapitest)

    PS:欢迎关注我的公众号~

    公众号

    相关文章

      网友评论

        本文标题:Django的登录功能(六)

        本文链接:https://www.haomeiwen.com/subject/naasuqtx.html