算法流程如下:
1)处理用户注册数据,存入数据库,is_activity字段设置为False,用户未认证之前不允许登陆
2)产生token,生成验证连接URL
3)发送验证邮件
4)用户通过认证邮箱点击验证连接,激活is_activity字段,可以登录
5)若验证连接过期,删除用户在数据库中的注册信息。
#系统root邮箱 settings.py
EMAIL_HOST = 'smtp.qq.com' EMAIL_HOST_USER = '17********@qq.com' #授权码 EMAIL_HOST_PASSWORD = 'dxsblqtqohiycgcb' EMAIL_PORT = 587 EMAIL_USE_TLS = True #可以域名,可以设置本地 DOMAIN = 'http://127.0.0.1:8000' |
#注册相关路由 url.py
1
2
|
url(r '^register/$' , reg, name = 'reg' ), url(r '^activate/(?P<token>w+.[-_w]*w+.[-_w]*w+)/$' , activate,name = 'activate' ), |
#注册视图函数 user/views.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
def reg(request): try : if request.method = = 'POST' : print request.method register_form = RegForm(request.POST) if register_form.is_valid(): print '数据验证通过!' username = register_form.cleaned_data[ 'username' ] email = register_form.cleaned_data[ 'email' ] password = register_form.cleaned_data[ 'password' ] user = UserProfile.objects.create( username = username, email = email, password = password, ) user.save() print '注册信息保存成功!' # 邮箱验证 token = token_confirm.generate_validate_token(username) token_url = '/' .join([django_settings.DOMAIN, 'activate' , token]) message = "
" .join([u '{0},欢迎加入XX' . format (username), u '请访问该链接,完成用户验证:' ,u "< a href = " + token_url + u " > " + token_url + u " < / a > " ]) send_mail(u '注册用户验证信息' , message, '17******@qq.com' , [email], fail_silently = False ) return render(request, 'common/success.html' , { 'reason' : u "已将激活链接发送到您的注册邮箱,请登录激活,有效期为1个小时" }) else : return render(request, 'common/failure.html' , { 'reason' : register_form.errors}) else : register_form = RegForm() except Exception as e: print '错误' ,e |
#用户点击邮箱链接,账户激活 user/views.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
def activate(request, token): try : username = token_confirm.confirm_validate_token(token) except : #令牌过期 username = token_confirm.remove_validate_token(token) users = UserProfile.objects. filter (username = username) for user in users: user.delete() #删除注册用户 return render(request, 'common/failure.html' , { 'reason' : u '对不起,验证链接已经过期,请重新<a href="' + unicode (django_settings.DOMAIN) + u '/register">注册</a>' }) try : user = UserProfile.objects.get(username = username) except UserProfile.DoesNotExist: return render(request, 'common/failure.html' , { 'reason' : u "对不起,您所验证的用户不存在,请重新注册" }) user.is_active = True user.save() message = u '终于等到你!账号激活成功,可以进行<a href="' + unicode (django_settings.DOMAIN) + u '/login">登录</a>操作' return render(request, 'common/success.html' , { 'reason' : message}) |
参考:https://my.oschina.net/keyven/blog/726123