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

  用户名

  邮箱

  密码

  确认密码

  验证码

这里选择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)   #单位为秒

Django之用户注册的更多相关文章

  1. Django: 之用户注册、缓存和静态网页

    Django 用户注册系统 Django 的源码中已经有登录,退出,重设密码等相关的视图函数,在下面这个app中 django.contrib.auth 可以点击对应的版本查看相关源代码:1.9  1 ...

  2. Django实现用户注册登录

    学习Django中:试着着写一个用户注册登录系统,开始搞事情 =====O(∩_∩)O哈哈~===== ================= Ubuntu python 2.7.12 Django 1. ...

  3. Django实战-用户注册和登陆系统

    1.环境搭建和创建项目 1.环境搭建 每当我们开始一个新项目的时候,通常都会搭建一个全新.独立.隔离的项目环境,这样做的好处自然不必多说.有很多种建立项目虚拟环境的工具,使用比较普遍的是Python中 ...

  4. django实现用户注册、登录、退出

    视图 from django.contrib import auth from django.contrib.auth.models import User from django.views.dec ...

  5. Django 简单用户注册

    项目名 macboy app名 t1 1.项目macboy urls.py from django.conf.urls import url, include urlpatterns = [ url( ...

  6. 【Python】【Django】用户注册功能

    GET方法前置步骤做完 stu.models.py 再其中创建需要用到的字段及对应数据库的表 # -*- coding: utf-8 -*- from __future__ import unicod ...

  7. django相关网站

    记录django的学习笔记:http://www.cnblogs.com/qwj-sysu/tag/django/ uwsgi的文档:http://uwsgi-docs.readthedocs.io/ ...

  8. 【Python】Django CSRF问题

    参考资料: Django Ajax CSRF 认证:http://www.ziqiangxuetang.com/django/django-csrf.html Python Post遇到csrftok ...

  9. Django+bootstrap+注册登录系统

    转自:https://www.cnblogs.com/robindong/p/9610057.html Robin_D 博客园 首页 新随笔 联系 订阅 管理 随笔 - 10  文章 - 0  评论 ...

随机推荐

  1. HDU-盐水的故事

    http://acm.hdu.edu.cn/showproblem.php?pid=1408 这是一道高精度问题: 在自己错了数十遍之后找到了不少规律: 首先是Output limit exceede ...

  2. setitimer()函数

    定时器时间函数 struct itimerval: struct itimerval *new_value,其定义如下: struct itimerval { struct timeval it_in ...

  3. Jmeter 5.1实现图片上传接口测试

    背景: 项目过程中需要抓取接口进行图片上传的接口测试,所有上传功能大同小异,无非就是参数内容不同,此处记录一下,为其他上传做一些参考 1.通过fiddler抓取到的参数如下: Content-Disp ...

  4. ACL终极详解

  5. Perl字符贪吃蛇

    一时兴起,想试试能不能用perl实现字符贪吃蛇,算法如下: 定义2个数组@bg.@snake,@bg用来显示整个界面,@snake从蛇头开始保存蛇的坐标点. 蛇每移动一次,新的坐标点放到@snake头 ...

  6. 查看mysql事务的隔离级别

    1.选择数据库,查看当前事务隔离界别 select @@tx_isolation; 2.开启事务,回滚事务 3.事务级别中脏读,幻读 4.MySQL事务autocommit设置,每次sql必须用com ...

  7. [root@offical nginx]# nginx -t nginx: [emerg] module "/usr/lib64/nginx/modules/ngx_http_geoip_module.so" version 1012002 instead of 1016001 in /usr/share/nginx/modules/mod-http-geoip.conf:1 nginx: con

    [root@offical nginx]# nginx -tnginx: [emerg] module "/usr/lib64/nginx/modules/ngx_http_geoip_mo ...

  8. [原][osg][OSGEARTH]OE的关闭打开自动计算裁剪面被OE的海洋ocean影响

    在osgEarthUtil 下 Ocean.cpp 的  traverse函数中: // we don't want the ocean participating in the N/F calcul ...

  9. Visio 的键盘快捷方式

    https://support.office.com/zh-cn/article/Visio-的键盘快捷方式-ee952f31-7e3e-4564-8116-f3ecbb733cc1 https:// ...

  10. 【转】Django继承AbstractUser新建User Model时出现auth.User.groups: (fields.E304)错误

    错误详情如下: (venv) D:\workspace\music>python manage.py makemigrations SystemCheckError: System check ...