前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django的登录功能(六)

Django的登录功能(六)

作者头像
zx钟
发布2019-07-19 16:33:32
7830
发布2019-07-19 16:33:32
举报
文章被收录于专栏:测试游记测试游记

勾选同意协议的校验

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

代码语言:javascript
复制
1<div class="form-group">
2    <label>
3        <input type="checkbox" name="aggree" value="1"> 我同意协议
4    </label>
5</div>

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

断点在页面上输入内容后点击注册按钮

调试模式 从图中可以看到aggree字段。同理测试一下不勾选之后的传输内容:

不勾选的调试 可以看到压根就没了这个字段了。所以我们的判断就是有没有这个字段好了。加上点容错处理使用字典的get好了

代码语言:javascript
复制
1if not request.POST.get('aggree'):
2    return to_json_data(errno=Code.AGGREE,errmsg=error_map[Code.AGGREE])

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

登录功能

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

代码语言:javascript
复制
 1<!DOCTYPE html>
 2<html lang="en">
 3<head>
 4  <meta charset="UTF-8">
 5  <title>接口测试平台</title>
 6</head>
 7<body>
 8
 9</body>
10</html>

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

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

csrf校验

获取前端返回的参数

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

代码语言:javascript
复制
1  def post(self,request):
2        try:
3            json_data = request.POST
4            if not json_data:
5                return to_json_data(errno=Code.PARAMERR, errmsg="参数为空,请重新输入")
6            dict_data = json.loads(json_data.decode('utf8'))
7        except Exception as e:
8            logging.info('错误信息:\n{}'.format(e))
9            return to_json_data(errno=Code.UNKOWNERR, errmsg=error_map[Code.UNKOWNERR])

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

登录POST请求

校验参数

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

代码语言:javascript
复制
 1class LoginForm(forms.Form):
 2    """
 3    login form data
 4    """
 5    email = forms.EmailField()
 6    password = forms.CharField(label='密码', max_length=20, min_length=6,
 7                               error_messages={"min_length": "密码长度要大于6", "max_length": "密码长度要小于20",
 8                                               "required": "密码不能为空"}
 9                               )
10    remember_me = forms.BooleanField(required=False)
11
12    def __init__(self, *args, **kwargs):
13        """
14
15        :param args:
16        :param kwargs:
17        """
18        self.request = kwargs.pop('request', None)
19        super(LoginForm, self).__init__(*args, **kwargs)
20
21    def clean(self):
22        """
23
24        :return:
25        """
26        # 1.获取清洗之后的参数
27        cleanded_data = super().clean()
28        user_info = cleanded_data.get('email')
29        passwd = cleanded_data.get('password')
30        hold_login = cleanded_data.get('remember')
31        # 2.查询数据库,判断用户账号和密码是否正确
32        user_queryset = User.objects.filter(Q(email=user_info))
33        if user_queryset:
34            user = user_queryset.first()
35            if user_queryset.get(password=passwd):
36                # 3.是否将用户信息设置到会话中
37                if hold_login:
38                    self.request.session.set_expiry(constants.USER_SESSION_EXPIRES)
39                else:
40                    self.request.session.set_expiry(0)  # 关闭浏览器清空
41            else:
42                raise forms.ValidationError('用户密码有误,请重新输入!')
43        else:
44            raise forms.ValidationError('用户账号不存在,请重新输入!')

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

代码语言:javascript
复制
1cleanded_data = super().clean()
2user_info = cleanded_data.get('email')
3passwd = cleanded_data.get('password')
4hold_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设置会话保存的时长。

代码语言:javascript
复制
1# 用户session信息过期时间,单位秒,这里设置为5天
2USER_SESSION_EXPIRES = 5 * 24 * 60 * 60

cookie

cookie 从图片可以看出会话的保持时间是到浏览器关闭为止。 这与我们的计划有点出路了,我们的配置应该是能保存5天的呀! 通过断点检查一下代码

断点 发现hold_login拿的的是None,往上翻一下原来是name与forms中的命名不一致 修改这一行:remember = forms.BooleanField(required=False) 再次测试 查看新的过期时间:

过期时间

后端代码

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

代码语言:javascript
复制
 1  def post(self, request):
 2        try:
 3            json_data = request.POST
 4            if not json_data:
 5                return to_json_data(errno=Code.PARAMERR, errmsg="参数为空,请重新输入")
 6            use_key = [ "email","password", "remember"]
 7            dict_data = {}
 8            for i in use_key:
 9                dict_data[i] = request.POST.get(i)
10        except Exception as e:
11            logging.info('错误信息:\n{}'.format(e))
12            return to_json_data(errno=Code.UNKOWNERR, errmsg=error_map[Code.UNKOWNERR])
13        form = LoginForm(data=dict_data, request=request)
14        if form.is_valid():
15            return render(request,'index/index.html')
16        else:
17            err_msg_list = []
18            for item in form.errors.get_json_data().values():
19                err_msg_list.append(item[0].get('message'))
20            err_msg_str = '/'.join(err_msg_list)
21            return to_json_data(errno=Code.PARAMERR, errmsg=err_msg_str)
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试游记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 勾选同意协议的校验
  • 登录功能
    • 获取前端返回的参数
      • 校验参数
        • 用户登录,设置会话信息
          • 后端代码
          相关产品与服务
          消息队列 TDMQ
          消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档