在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脚本将文字转换为图片的实例分享
Aug 29 Python
Pycharm学习教程(4) Python解释器的相关配置
May 03 Python
python抽取指定url页面的title方法
May 11 Python
Pycharm无法显示动态图片的解决方法
Oct 28 Python
VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法详解
Jul 01 Python
Django Aggregation聚合使用方法解析
Aug 01 Python
Python 字符串、列表、元组的截取与切片操作示例
Sep 17 Python
解析Python 偏函数用法全方位实现
Jun 26 Python
浅谈keras 模型用于预测时的注意事项
Jun 27 Python
在django中查询获取数据,get, filter,all(),values()操作
Aug 09 Python
python dir函数快速掌握用法技巧
Dec 09 Python
Python基础之函数嵌套知识总结
May 23 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连接SQLSERVER 注意事项(附dll文件下载)
2012/06/28 PHP
JS异常处理try..catch语句的作用和实例
2014/05/05 PHP
Yii2框架dropDownList下拉菜单用法实例分析
2016/07/18 PHP
Ext.FormPanel 提交和 Ext.Ajax.request 异步提交函数的区别
2009/11/12 Javascript
JavaScript 学习笔记 Black.Caffeine 09.11.28
2009/11/30 Javascript
获取dom元素那些讨厌的位置封装代码
2010/06/23 Javascript
javascript数组操作总结和属性、方法介绍
2014/04/05 Javascript
多种方法实现360浏览器下禁止自动填写用户名密码
2014/06/16 Javascript
jQuery调取jSon数据并展示的方法
2015/01/29 Javascript
javascript用函数实现对象的方法
2015/05/14 Javascript
JavaScript实现仿网易通行证表单验证
2015/05/25 Javascript
JS中数组重排序方法
2016/11/11 Javascript
Cookies 和 Session的详解及区别
2017/04/21 Javascript
js移动端事件基础及常用事件库详解
2017/08/15 Javascript
vue-ajax小封装实例
2017/09/18 Javascript
Node.JS循环删除非空文件夹及子目录下的所有文件
2018/03/12 Javascript
使用vue-cli打包过程中的步骤以及问题的解决
2018/05/08 Javascript
vue+高德地图写地图选址组件的方法
2019/05/18 Javascript
小程序登录/注册页面设计的实现代码
2019/05/24 Javascript
react PropTypes校验传递的值操作示例
2020/04/28 Javascript
nuxt 实现在其它js文件中使用store的方式
2020/11/05 Javascript
微信小程序用户登录和登录态维护的实现
2020/12/10 Javascript
[03:42]2018完美盛典-《加冕》
2018/12/16 DOTA
Python操作使用MySQL数据库的实例代码
2017/05/25 Python
Django 生成登陆验证码代码分享
2017/12/12 Python
python3安装speech语音模块的方法
2018/12/24 Python
Python3模拟登录操作实例分析
2019/03/12 Python
python实现ip地址查询经纬度定位详解
2019/08/30 Python
基于Python3.6中的OpenCV实现图片色彩空间的转换
2020/02/03 Python
新版Pycharm中Matplotlib不会弹出独立的显示窗口的问题
2020/06/02 Python
利用Python过滤相似文本的简单方法示例
2021/02/03 Python
25岁生日感言
2014/01/13 职场文书
装修协议书范本
2014/04/21 职场文书
2015年测量员工作总结
2015/05/23 职场文书
话题作文之成长
2019/12/09 职场文书
《宝可梦》动画制作25周年到来 官方发布特别纪念视频
2022/04/01 日漫