在Django中进行用户注册和邮箱验证的方法


Posted in Python onMay 09, 2016

本文主要介绍我在利用Django写文章时,采用的注册方法。首先说一下整体逻辑思路:

•处理用户注册数据,

•产生token,生成验证URL,

•发送验证邮件,

•用户登录网址,进行验证,

•验证处理。

具体步骤:

1、添加用户

在Django中自带的User表中,有一个is_active字段,默认值是True,即用户填完表单提交之后,就可以进行登录。我们这里首先将is_acitve字段设为False,也就是说,必须经过后续的邮箱验证,才能够正常登录。

部分代码:

if request.method == 'POST':
form = CustomUserCreationForm(request.POST)
if form.is_valid():
cd = form.cleaned_data
#new_user = form.save()
username,password,email = cd['username'],cd['password1'],cd['email']
user = User.objects.create(username=username, password=password, email=email, is_active=False)
user.set_password(password)
user.save()

提交后,数据库中会增加一条记录,但is_acitve字段为False,此时还不是有效用户。

2、邮件验证

邮件验证主要有两步,一是产证token,即加密,二是处理验证链接。

1)产生token

之前我采用的是简单的base64加解密方法, 但终究是太简单了,后来看到关于Flask的验证用户的文章(http://python.jobbole.com/81410/),就采用了itsdangerous序列化方法,其实Flask的session就用了itsdangerous序列化。我使用它的重要原因是它自带有一个时间戳,而且序列化方法要比单纯的使用base64给力得多。

代码:

from itsdangerous import URLSafeTimedSerializer as utsr
import base64
import re

class Token():

def __init__(self,security_key):
self.security_key = security_key
self.salt = base64.encodestring(security_key)
def generate_validate_token(self,username):
serializer = utsr(self.security_key)
return serializer.dumps(username,self.salt)
def confirm_validate_token(self,token,expiration=3600):
serializer = utsr(self.security_key)
return serializer.loads(token,
salt=self.salt,
max_age=expiration)

security_key就是settings.py中设置的SECRET_KEY,salt是经过base64加密的SECRET_KEY, generate_validate_token函数通过URLSafeTimedSerializer在用户注册时生成一个令牌。用户名在令牌中被编了码。生成令牌之后,会将带有token的验证链接发送到注册邮箱。在confirm_validate_token函数中,只要令牌没过期,那它就会返回一个用户名,过期时间为3600秒。

发送邮件函数代码:

token = token_confirm.generate_validate_token(username)
#active_key = base64.encodestring(username)
#send email to the register email
message = "\n".join([
u'{0},欢迎加入我的博客'.format(username),
u'请访问该链接,完成用户验证:',
'/'.join([DOMAIN,'account/activate',token])
])
send_mail(u'注册用户验证信息',message, None,[email])

2)处理邮件验证

就是对应验证链接的视图函数,该函数的主要目的是将User表中用户的is_active字段更新为True。

def active_user(request,token):
username = token_confirm.confirm_validate_token(token)
user = User.objects.get(username=username)
user.is_active = True
user.save()

这里要说一下url的设置。经过itsdangerous产生的token是随机且规律的,说它规律是因为它是由三部分组成,并由点号隔开。类似这样:Imhibm4i.Cg-UAQ.n7ZI2N9kUZ1eOcfBtxlMOdOYYE0。说它随机是因为每一部分的内容可能不仅仅含有字母数字,可能还含有连接符-,_。因此url应该是:url(r'^account/activate/(?P<token>\w+.[-_\w]*\w+.[-_\w]*\w+)/$','blog.views.active_user',name='active_user')

经过上述操作后,用户就可以利用刚注册的用户名进行登录了。

贴出完整代码:

from utils.token import Token
from django.core.mail import send_mail
from .forms import UserLoginForm,CustomUserCreationForm
token_confirm = Token(SECRET_KEY)

def Register(request):

if request.method == 'POST':
form = CustomUserCreationForm(request.POST)
if form.is_valid():
cd = form.cleaned_data
#new_user = form.save()
username,password,email = cd['username'],cd['password1'],cd['email']
user = User.objects.create(username=username, password=password, email=email, is_active=False)
user.set_password(password)
user.save()
token = token_confirm.generate_validate_token(username)
#active_key = base64.encodestring(username)
#send email to the register email
message = "\n".join([
u'{0},欢迎加入我的博客'.format(username),
u'请访问该链接,完成用户验证:',
'/'.join([DOMAIN,'account/activate',token])
])
send_mail(u'注册用户验证信息',message, None,[cd['email']])
#user = auth.authenticate(username=username,password=password)
#auth.login(request,user)
return HttpResponse(u"请登录到注册邮箱中验证用户,有效期为1个小时。")
else:
form = CustomUserCreationForm()
return render(request,'register.html',{'form':form})
def active_user(request,token):
"""
the view function is used to accomplish the user register confirm,only after input the link
that sent to the register email,user can login the site normally.
:param request:
:param activate_key:the paragram is gotten by encrypting username when user register
:return:
"""
try:
username = token_confirm.confirm_validate_token(token)
except:
return HttpResponse(u'对不起,验证链接已经过期')
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
return HttpResponse(u'对不起,您所验证的用户不存在,请重新注册')
user.is_active = True
user.save()
confirm = u'验证成功,请进行登录操作。'
return HttpResponseRedirect('/account/login',{'confirm':confirm})

以上所述是小编给大家介绍的在Django中进行用户注册和邮箱验证的方法,希望对大家有所帮助!

Python 相关文章推荐
python使用beautifulsoup从爱奇艺网抓取视频播放
Jan 23 Python
Python实现Linux下守护进程的编写方法
Aug 22 Python
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
Jul 02 Python
python 读写、创建 文件的方法(必看)
Sep 12 Python
不要用强制方法杀掉python线程
Feb 26 Python
下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决
Apr 23 Python
Windows下python3.6.4安装教程
Jul 31 Python
利用Python检测URL状态
Jul 31 Python
Python进程池Pool应用实例分析
Nov 27 Python
Django高并发负载均衡实现原理详解
Apr 04 Python
利用Python中的Xpath实现一个在线汇率转换器
Sep 09 Python
Python之Matplotlib绘制热力图和面积图
Apr 13 Python
Python数据类型详解(三)元祖:tuple
May 08 #Python
Python数据类型详解(二)列表
May 08 #Python
Python数据类型详解(一)字符串
May 08 #Python
Python常用知识点汇总
May 08 #Python
Python对list列表结构中的值进行去重的方法总结
May 07 #Python
Python环境下安装使用异步任务队列包Celery的基础教程
May 07 #Python
Python编写电话薄实现增删改查功能
May 07 #Python
You might like
PHP加速 eAccelerator配置和使用指南
2009/06/05 PHP
完美实现GIF动画缩略图的php代码
2011/01/02 PHP
ThinkPHP实现将本地文件打包成zip下载
2014/06/26 PHP
php mysql PDO 查询操作的实例详解
2017/09/23 PHP
php微信开发之关键词回复功能
2018/06/13 PHP
拖动Html元素集合 Drag and Drop any item
2006/12/22 Javascript
jMessageBox 基于jQuery的窗口插件
2009/12/09 Javascript
给Flash加一个超链接(推荐使用透明层)兼容主流浏览器
2013/06/09 Javascript
javascript用户注册提示效果的简单实例
2013/08/17 Javascript
深入浅析Bootstrap列表组组件
2016/05/03 Javascript
JS面试题---关于算法台阶的问题
2016/07/26 Javascript
Node.js包管理器Yarn的入门介绍与安装
2016/10/17 Javascript
javascript实现用户点击数量统计
2016/12/25 Javascript
webpack2.0配置postcss-loader的方法
2017/08/17 Javascript
JavaScript实现HTML5游戏断线自动重连的方法
2017/09/18 Javascript
vue中使用input[type=&quot;file&quot;]实现文件上传功能
2018/09/10 Javascript
解决前后端分离 vue+springboot 跨域 session+cookie失效问题
2019/05/13 Javascript
小程序开发之模态框组件封装
2020/04/23 Javascript
vue使用exif获取图片经纬度的示例代码
2020/12/11 Vue.js
[01:48:04]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第一场 2月7日
2021/03/11 DOTA
[55:26]DOTA2-DPC中国联赛 正赛 Aster vs LBZS BO3 第一场 2月23日
2021/03/11 DOTA
详解python的ORM中Pony用法
2018/02/09 Python
Python开发虚拟环境使用virtualenvwrapper的搭建步骤教程图解
2018/09/19 Python
python之当你发现QTimer不能用时的解决方法
2019/06/21 Python
python fuzzywuzzy模块模糊字符串匹配详细用法
2019/08/29 Python
Python3 mmap内存映射文件示例解析
2020/03/23 Python
PyTorch 导数应用的使用教程
2020/08/31 Python
conda安装tensorflow和conda常用命令小结
2021/02/20 Python
来自世界各地的饮料:Flavourly
2019/05/06 全球购物
父母对孩子说的话
2014/04/12 职场文书
上课睡觉检讨书300字
2014/11/18 职场文书
优秀工作者事迹材料
2014/12/26 职场文书
怎样写离婚协议书
2015/01/26 职场文书
趣味运动会标语口号
2015/12/26 职场文书
MongoDB连接数据库并创建数据等使用方法
2021/11/27 MongoDB
解决Springboot PostMapping无法获取数据的问题
2022/05/06 Java/Android