zoukankan      html  css  js  c++  java
  • 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)   #单位为秒

  • 相关阅读:
    线段树模板(HDU 6356 Glad You Came)
    Treap模板
    Codeforces Round #499 (Div. 2) D. Rocket题解
    Codeforces Round #499 (Div. 2) C Fly题解
    KMP与AC自动机模板
    HDU 6351 Naive Operations(线段树)
    python核心编程第六章练习6-13
    python核心编程第六章练习6-12
    [转]我为什么要学习python
    python核心编程第六章练习6-11
  • 原文地址:https://www.cnblogs.com/roygood/p/10012773.html
Copyright © 2011-2022 走看看