勾选同意协议的校验
发现上一篇里面忘了对勾选我同意协议
的校验了。虽然也没啥协议,但是样子还是要做一下的。register.html
里面的对应区域:
1<div class="form-group">
2 <label>
3 <input type="checkbox" name="aggree" value="1"> 我同意协议
4 </label>
5</div>
它的name是aggree
。我们继续打上断点来进行测试一下,传输的过程中它去哪里了。
![断点 640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/2a3fe04c3380ed9c348e31c16445f831.png)
![调试模式 640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/cecac3e75b7c7f4bbe8fefaf8f50ab63.jpeg)
从图中可以看到
aggree
字段。同理测试一下不勾选之后的传输内容:
![不勾选的调试 640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/0fd554176a7bc1067e4d6f698bcaa14b.jpeg)
可以看到压根就没了这个字段了。所以我们的判断就是有没有这个字段好了。加上点容错处理使用字典的get好了
1if not request.POST.get('aggree'):
2 return to_json_data(errno=Code.AGGREE,errmsg=error_map[Code.AGGREE])
以上我们完成了初步的注册功能。但是其中肉眼可见的很多bug。这些问题在后续的自测中在进行修改好了。
登录功能
下面来写登录功能了,不过写之前先写一下登录完成之后的页面,不然登录到哪里去?index.html
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>
这个先挖个坑好了,之后具体的内容再进行替换。LoginView
的post
请求
获取前端返回的参数
校验参数
用户登录,设置会话信息
返回前端
{% csrf_token %}
csrf校验
获取前端返回的参数
下面是后端代码的编写。
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请求 640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/017ad6ced07f8f979724c6c209ccd9c6.jpeg)
校验参数
看样子没问题,然后进行内容的校验。需要和数据库进行比对
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函数
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
是前端的勾选记住我
;user_queryset = User.objects.filter(Q(email=user_info))
user_queryset.get(password=passwd)
用户登录,设置会话信息
使用self.request.session.set_expiry
设置会话保存的时长。
1# 用户session信息过期时间,单位秒,这里设置为5天
2USER_SESSION_EXPIRES = 5 * 24 * 60 * 60
![cookie 640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/d37b90aff6a8c117f0ac68e362fc7ed8.jpeg)
![cookie 640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/7a1849e530bd6111a5ca6bf4f0014cc9.jpeg)
从图片可以看出会话的保持时间是到浏览器关闭为止。
这与我们的计划有点出路了,我们的配置应该是能保存5天的呀!
通过断点检查一下代码
![断点 640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/53ffd3b87d818c9d71251d71b6514444.jpeg)
发现
hold_login
拿的的是
None
,往上翻一下原来是name与forms中的命名不一致
修改这一行:
remember = forms.BooleanField(required=False)
再次测试
查看新的过期时间:
![过期时间 640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/e6cd718a629865d5e64be30d01864c34.jpeg)
后端代码
以下是post相关部分的代码。
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)
欢迎查阅源码:(https://github.com/zx490336534/Zxapitest)
PS:欢迎关注我的公众号~
![公众号 640?wx_fmt=other](https://i-blog.csdnimg.cn/blog_migrate/4f76a3f64419fd36a884e77a25053a14.jpeg)