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

  用户名

  邮箱

  密码

  确认密码

  验证码

这里选择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. csp-s模拟测试93T2口胡(蒟蒻的口胡大家显然就不用看了吧

    我们先证正确性,再证复杂度 以下记$\left \langle i,j \right \rangle$为考虑$\left [ i,j \right ]$的点时的最优决策 $\left \langle ...

  2. linux (core dump)调试

    转自 http://www.cnblogs.com/hazir/p/linxu_core_dump.html Linux Core Dump 当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内 ...

  3. Deepin-TIM或Deepin-QQ调整界面DPI字体大小的方法

    Deepin-TIM或Deepin-QQ调整界面DPI字体大小的方法 env WINEPREFIX="/home/landv/.deepinwine/Deepin-QQ" deep ...

  4. [WEB安全]无回显代码执行【转载】

    原作者:AdminTony 原文链接:http://www.admintony.com/无回显代码执行利用方法.html 在Root-Me上有一道代码执行的题目,其链接为题目链接 0x01 简介 打开 ...

  5. 第10组 Alpha冲刺(3/6)

    链接部分 队名:女生都队 组长博客: 博客链接 作业博客:博客链接 小组内容 恩泽(组长) 过去两天完成了哪些任务 描述 对推送模块进行详细划分 基于用户的协同过滤,寻找更感兴趣的话题 学习API文档 ...

  6. Python flask模块接口开发学习总结

    引言 Flask 是一个简单且十分强大的Python web 框架.它被称为微框架,“微”并不是意味着把整个Web应用放入到一个Python文件,微框架中的“微”是指Flask旨在保持代码简洁且易于扩 ...

  7. 前端 MV*框架的意义

    早期前端都是比较简单,基本以页面为工作单元,内容以浏览型为主,也偶尔有简单的表单操作,基本不太需要框架. 随着 AJAX 的出现,Web2.0的兴起,人们可以在页面上可以做比较复杂的事情了,然后前端框 ...

  8. 第2课第2节_Java面向对象编程_封装性_P【学习笔记】

    摘要:韦东山android视频学习笔记  面向对象程序的三大特性之封装性:把属性和方法封装在一个整体,同时添加权限访问. 1.封装性的简单程序如下,看一下第19行,如果我们不对age变量进行权限的管控 ...

  9. 胶囊网络 -- Capsule Networks

    胶囊网络是 vector in vector out的结构,最后对每个不同的类别,输出不一个向量,向量的模长表示属于该类别的概率. 例如,在数字识别中,两个数字虽然重叠在一起,Capsule中的两个向 ...

  10. Cannot find module 'laravel-elixir'问题解决方法

    在用gulp 安装elixir的时候报了这样的错误: Laravel elixir npm error Cannot find module 'laravel-elixir/ingredients/c ...