邮箱激活账号:生成加密连接,发送邮件,用户点击连接,然后解密,激活账号
使用邮箱激活,外国用户也能注册
- 导入,需要pip install itsdangerous安装生成token的第三方库
from itsdangerous import TimedJSONWebSignatureSerializer # 生成token
from itsdangerous import SignatureExpired # token超时发生的异常
- 加密
serializer = TimedJSONWebSignatureSerializer('SECRET_KEY', 3600)
info = {'uid': user.uid} # 要加密的字典
token = serializer.dumps(info) # 加密,生成token
token = token.decode('utf-8') # 生成的token默认是byte类型,需要解码
# HTML模板
html = '<h1>%s,欢迎你注册</h1> 点击下面链接激活账号<br> <a href="http://127.0.0.1:8000/active/%s">http://127.0.0.1:8000/active/%s</a">' % (username, token, token)
# 发送邮件
send_mail('账号激活', '', '1251779123@qq.com', [request.POST.get('emial')], html_message=html)
- 查看邮箱
- 账号激活处理(解密)
路由
# 邮箱激活账号,要接受token参数
path('active/<token>/', views.emial_active, name='active'),
解密
# 邮箱验证激活账号
def emial_active(request, token):
try:
serializer = TimedJSONWebSignatureSerializer('SECRET_KEY', 3600) # 方法二
info = serializer.loads(token) # 解密,加密的时候是字典,解密的时候还是字典
uid = info.get('uid')
except SignatureExpired as e: # token过期的错误SignatureExpired
# uid = token_confirm.remove_validate_token(token) # 方法一,解密出错则删除token
user = User.objects.get(pk=uid) # 连账号也删除,让用户重新注册
user.delete()
return HttpResponse('激活链接过期,请重新注册')
try:
user = User.objects.get(pk=uid) # 在数据库里查找用户,找不到则表示用户不存在
except:
return HttpResponse('用户不存在,请重新注册')
# 激活
user.is_active = 1
user.save()
return redirect(reverse('user:login')) # 激活成功,重定向到登录页面
完成,测试一下
使用celery异步发送邮件(使用redis作为中间人)
安装
- pip install celery
创建celery包
在项目目录下新建celery_tasks的python包(名字随意),然后创建tasks.py文件
# 使用celery
from celery import Celery
from django.core.mail import send_mail # 发送邮件
from U.settings import EMAIL_FROM # 服务器发送邮件的邮箱
import time
# 如果任务处理者(worker)在另一台电脑启动则需要把整个项目代码复制一份过去,而且要在worker加上下面四句,为了加载配置
# import os
# os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'U.settings')
# import django
# django.setup()
# 创建Celery类实例对象
# main一般为tasks的路径 中间人redis地址,使用6号数据库
app = Celery(main='celery_tasks_tasks', broker='redis://127.0.0.1/6')
# 定义任务函数,发送注册激活邮件
@app.task
def send_register_active_emial(to_emial, username, token):
'''发送激活邮件
to_emial: 发给谁
username: 用户名
token: token值
'''
# 组织邮件信息
html = '<h1>%s,欢迎你注册</h1> 点击下面链接激活账号<br> <a href="http://127.0.0.1:8000/active/%s">http://127.0.0.1:8000/active/%s</a">' % (
username, token, token)
# 发送邮件
send_mail('账号激活', '', EMAIL_FROM, [to_emial], html_message=html)
time.sleep(5)
在视图里面导入然后调用发送邮件函数
from celery_tasks.tasks import send_register_active_emial
send_register_active_emial.delay(request.POST.get('emial'), username, token)
发出者跟处理者可以在同一台电脑,也可以不在,但要拷贝一份项目代码给处理者(worker),因为处理者不用启动python项目, 并且要在处理者的tasks.py文件里加上以下几句代码,用来加载项目的配置
处理者的tasks.py
# 如果任务处理者(worker)在另一台电脑启动则需要把整个项目代码复制一份过去,而且要在worker加上下面四句,为了加载配置
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'U.settings')
import django
django.setup()
启动
任务发出者:python manage.py runserver
任务处理者:celery -A celery_tasks.tasks worker -l info
在windows下还有要安装:pip install eventlet
任务处理者:celery -A celery_tasks.tasks worker -l info -P eventlet
有用户注册时,发送邮件会在后台执行,前台不会等待
任务处理者(worker)收到了任务,如下