Django之用户注册

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

  用户名

  邮箱

  密码

  确认密码

  验证码

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

在urls中添加路由

  略

编写注册响应函数

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

from django.core.exceptions import ValidationError

from django.core.exceptions import ValidationError
from django import forms as django_forms
from django.forms import fields as django_fields
from django.forms import widgets as django_widgets
from repository import models

class 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" onclick="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)   #单位为秒

posted @ 2018-11-24 17:21  Roygood  阅读(666)  评论(0编辑  收藏  举报