在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利用OpenCV2实现人脸检测
Apr 16 Python
python爬虫基本知识
Mar 05 Python
详解python多线程、锁、event事件机制的简单使用
Apr 27 Python
Python使用Dijkstra算法实现求解图中最短路径距离问题详解
May 16 Python
Python列表解析配合if else的方法
Jun 23 Python
Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】
Mar 30 Python
Python求两点之间的直线距离(2种实现方法)
Jul 07 Python
基于Python中的yield表达式介绍
Nov 19 Python
用OpenCV将视频分解成单帧图片,图片合成视频示例
Dec 10 Python
Python生成器常见问题及解决方案
Mar 21 Python
python读取图片颜色值并生成excel像素画的方法实例
Feb 19 Python
Python探索生命起源 matplotlib细胞自动机动画演示
Apr 21 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和ACCESS写聊天室(二)
2006/10/09 PHP
PHP创建桌面快捷方式的实例代码
2014/02/17 PHP
PHP开发框架laravel安装与配置教程
2015/03/13 PHP
使用PHP uniqid函数生成唯一ID
2015/11/18 PHP
thinkPHP框架实现的简单计算器示例
2018/12/07 PHP
JavaScript TO HTML 转换
2006/06/26 Javascript
JavaScript关于select的相关操作说明
2010/01/13 Javascript
Mac地址验证的javascript代码
2013/11/09 Javascript
随鼠标移动的时钟非常漂亮遗憾的是只支持IE
2014/08/12 Javascript
JavaScript中的无阻塞加载性能优化方案
2014/10/10 Javascript
微信中一些常用的js方法汇总
2015/03/12 Javascript
AngularJS整合Springmvc、Spring、Mybatis搭建开发环境
2016/02/25 Javascript
轻松实现js选项卡切换效果
2016/09/24 Javascript
nodejs的压缩文件模块archiver用法示例
2017/01/18 NodeJs
微信小程序 图片绝对定位(背景图片)
2017/04/05 Javascript
vue实现nav导航栏的方法
2017/12/13 Javascript
详解vue几种主动刷新的方法总结
2019/02/19 Javascript
webpack的pitching loader详解
2019/09/23 Javascript
微信小程序实现比较功能的方法汇总(五种方法)
2020/03/07 Javascript
vant实现购物车功能
2020/06/29 Javascript
js定时器出现第一次延迟的原因及解决方法
2021/01/04 Javascript
[04:28]DOTA2亚洲邀请赛小组赛第五日 TOP10精彩集锦
2015/02/03 DOTA
Python使用matplotlib简单绘图示例
2018/02/01 Python
python实现内存监控系统
2021/03/07 Python
PyQt QCombobox设置行高的方法
2019/06/20 Python
python 实现手机自动拨打电话的方法(通话压力测试)
2019/08/08 Python
使用npy转image图像并保存的实例
2020/07/01 Python
Django自定义YamlField实现过程解析
2020/11/11 Python
英国著名国际平价时尚男装品牌:Topman
2016/08/27 全球购物
英国索普公园票务和酒店套餐:Thorpe Breaks
2019/09/14 全球购物
美国名表在线商城:Ashford(支持中文)
2019/09/24 全球购物
生物医学工程专业学生求职信范文分享
2013/12/14 职场文书
卖房授权委托书样本
2014/10/05 职场文书
复试通知单模板
2015/04/24 职场文书
2016年党员公开承诺书格式范文
2016/03/24 职场文书
十大最强火系宝可梦,喷火龙上榜,第一名有双火属性
2022/03/18 日漫