Django之用户注册
发布日期:2021-09-05 00:32:54 浏览次数:11 分类:技术文章

本文共 3177 字,大约阅读时间需要 10 分钟。

用户注册需要提交的信息包括:

  用户名

  邮箱

  密码

  确认密码

  验证码

这里选择form表单提交信息,注册页面的响应函数就要分条件执行,get请求时要展示注册页面,post请求时要接收用户提交的信息,对信息格式、正确性、唯一性进行验证,如果有错误则返回错误信息,如果验证通过则将信息添加到数据库返回注册成功信息

在urls中添加路由

  略

编写注册响应函数

  这个响应函数主体为form验证,之后分成功或失败两种情况进行处理,由于在登录时也会有form表单验证,所以我们可以将form验证单独写到一个文件中,在注册或登录函数中再去引入

from django.core.exceptions import ValidationError

from django.core.exceptions import ValidationErrorfrom django import forms as django_formsfrom django.forms import fields as django_fieldsfrom django.forms import widgets as django_widgetsfrom repository import modelsclass BaseForm(object):  def __init__(self, request, *args, **kwargs):    self.request = request    super(BaseForm, self).__init__(*args, **kwargs)class RegisterForm(BaseForm,django_forms.Form):    username = django_fields.CharField(    min_length=6,    max_length=20,        error_messages={
'required': '用户名不能为空.', 'min_length': "用户名长度不能小于6个字符", 'max_length': "用户名长度不能大于32个字符"} ) password = django_fields.RegexField( '^(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[!@#$\%\^\&\*\(\)])[0-9a-zA-Z!@#$\%\^\&\*\(\)]{8,32}$', min_length=12, max_length=32, error_messages={
'required': '密码不能为空.', 'invalid': '密码必须包含数字,字母、特殊字符', 'min_length': "密码长度不能小于8个字符", 'max_length': "密码长度不能大于32个字符"} ) confirm_pwd = django_fields.CharField() def clean(self): v1 = self.cleaned_data['password'] v2 = self.cleaned_data['confirm_pwd'] if v1 == v2: pass else: from django.core.exceptions import ValidationError,NON_FIELD_ERRORS raise ValidationError('密码输入不一致')

 

Django没有密码字段,我们通过django_fields.RegexField自定义正则验证密码格式

要求:由数字和字母组成,并且要同时含有数字、字母和特殊字符,且长度要在8-32位之间

^(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[!@#$\%\^\&\*\(\)])[0-9a-zA-Z!@#$\%\^\&\*\(\)]{8,32}$

^ 匹配一行的开头位置

(?=.*[0-9]+$) 任意字符串后有一数字
(?=.*[a-zA-Z]+$) 任意字符串后有一字母

(?=.*[!@#$\%\^\&\*\(\)])任意字符串后有一特殊符号

[0-9a-zA-Z!@#$\%\^\&\*\(\)] {8,32} 由8-32位数字、字母和特殊字符组成
$ 匹配行结尾位置

cleaned_data 就是读取表单返回的值,返回类型为字典dict型

这里没有做唯一化验证

在注册函数里用form验证

form = LoginForm(request=request, data=request.POST)

if form.is_valid():  #验证判断,通过则将数据添加到数据库,并告知用户注册成功,不通过则返回错误信息

响应函数:

def register(request.):

  v = RegisterForm(request.POST)

  if v.is_valid():

    pass

  else:

    v.errors['username']

    v.errors['__all__']

    v.errors[NON_FIELD_ERRORS]

    v.errors{

      __all__: [],

      username: [],

      password: [],

      confirm_pwd: []

    }

  return render(request, 'register.html', {'v':v})

在html页面中使用{

{v.errors.username.0}}展示用户名错误信息, {
{v.non_field_errors}}展示所有错误信息

在登录页面和注册页面都会涉及到验证码,创建验证码图片,将图片写入到内存,用完即删,减少数据库操作。将随机的验证码字符串添加到session中,和用户发来的验证码做对比,这样可以实现一个用户一个专有验证码,各个用户验证码环节是独立的。

页面上的验证码还要有一个点击图片刷新的功能,这个功能一般情况下我们用ajax实现,还有一个有趣的方法,输入url页面其实有两次加载,第一次渲染页面,第二次通过img标签的src加载验证码图片,那我们可以在点击图片后对src对应的url添加?,添加?就是发送get请求重新执行生成验证码,这就实现了点击更换验证码图片的功能

<img src="/code.html" οnclick="changeImg(this);">

<script>

  function changeImg(ths) {

    ths.src = ths.src + "?";

  }

</script>

设置免登陆时间长度

 在setting中全局设置SESSION_COOKIE_AGE = 1209600                 # Session的cookie失效日期

在函数中局部设置 request.session.set_expiry(60 * 60 * 24 * 30)   #单位为秒

转载于:https://www.cnblogs.com/roygood/p/10012773.html

转载地址:https://blog.csdn.net/weixin_34228387/article/details/93220067 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:IDEA中添加类的创建者信息
下一篇:使用CefSharp跳转页面不弹出页面:

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年03月03日 13时49分19秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

同桌的你 2021-06-24
python时间序列因果检验_用python做时间序列预测八:Granger causality test(格兰杰因果检验)... 2019-04-21
python numpy 函数详解_python使用numpy中的size()函数实例用法详解 2019-04-21
java spring上传文件_Java Spring文件上传,Java文件上传,Java通用文件上传 2019-04-21
linux 模拟键盘输入到进程,Linux 下模拟键盘输入 2019-04-21
linux服务器上已安装R 用户下载R包,R语言安装R package的2种方法 2019-04-21
linux 7 磁盘空间太小,Linux下磁盘保留空间的调整,解决df看到的空间和实际磁盘大小不一致的问题... 2019-04-21
linux下mysql 备份方法,Linux下mysql数据库备份方法小结 2019-04-21
bootstrap 页面垂直居中_iframe中如何让layer提示框显示在垂直居中的位置 2019-04-21
肺部ct重建_胸片检查容易漏诊肺癌,去年正常今年晚期常发生,体检一定要做CT... 2019-04-21
3dmax如何拆分模型_3D建模大佬如何制作出惊艳四方的游戏建模,看完这篇文章我知道了... 2019-04-21
x86so文件装换成arm64位_64位系统正式发布说明及介绍!! 2019-04-21
for循环中取出最大最小 累加_LeetCode之长度最小的子数组 2019-04-21
如何打开老公人脸识别_【话题】南宁已有小区启用人脸识别门禁,有人点赞有人忧... 2019-04-21
makex机器人程序_机器人教育为相城青少年叩开科学世界大门 2019-04-21
一寸照纯红色底图片_Ella陈嘉桦也是“时髦精”,穿玫红色西装配拼色半身裙,高级洋气... 2019-04-21
米哈游客户端笔试题_Garena校招 游戏客户端开发通关面经 2019-04-21
airpodspro没有弹窗_使用AirPods Pro一天的主观感受 2019-04-21
创建物化视图commit_视图及范式 2019-04-21
函数传参字典_Python新手上车17:函数传递任意多个参数 2019-04-21