版本
python == 3.7.6
django == 2.1.8
celery == 4.4.7
redis == 3.5.3
eventlet == 0.26.1
首先在项目下创建我们所需要的文件celecry config
以上dashixun为我们的项目名称
settings中的配置
# 配置邮件发送
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.qq.com' # 如果为163邮箱,设置为smtp.163.com
EMAIL_PORT = 25 # 或者 465/587是设置了 SSL 加密方式
# 发送邮件的邮箱
EMAIL_HOST_USER = '885682182@qq.com'
# 在邮箱中设置的客户端授权密码
EMAIL_HOST_PASSWORD = 'fsqgtiyrntplbdad' # 第三方登陆使用的授权密码
EMAIL_USE_TLS = True # 这里必须是 True,否则发送不成功
# 收件人看到的发件人, 必须是一直且有效的
EMAIL_FROM = '权梁旭<885682182@qq.com>'
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
需要将我们发送的邮箱替换成自己的邮箱
客户端授权密码从下图中获取
QQ邮箱 设置/帐户 下
init中所需配置
# 绝对引用,使我们的celery模块不会与原始的celery冲突
from __future__ import absolute_import, unicode_literals
# 加入绝对引入以后,导入当前模块下的内容方法: from xx import xx as xx
from .celery import app as celery_app
__all__ = ('celery_app',)
celery中所需配置
# celery.py文件
import os
from celery import Celery
# 把celery和django进行组合,识别和加载django的配置文件
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dashixun.settings')
# 创建celery实例
app = Celery('dashixun')
# 指定celery消息队列的配置
app.config_from_object('dashixun.config', namespace='CELERY')
# 从所有的django-app中加载任务
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
以上需要将代码中的第五行第七行以及第九行中的项目名替换成自己的项目名
config中所需配置
# 消息中间人设置
broker_url = 'redis://127.0.0.1:6379/15'
# 结果存储设置
result_backend = 'redis://127.0.0.1:6379/14'
然后在我们需要执行异步的app下创建tasks
tasks中所需配置
# 绝对引用,使我们的celery模块不会与原始的celery冲突
from __future__ import absolute_import, unicode_literals
# 导入原始的celery模块中shared_task from xx import xx
from celery import shared_task
# 使用django内置函数发送邮件
from django.core.mail import send_mail
# 导入django的settings
from django.conf import settings
from dashixun.celery import app
@app.task
def send_mail_task(username, email, user_id):
"""
使用django内置函数发送邮件
"""
subject = '工单系统找回密码' # 主题
message = '' # 文本消息
from_email = settings.EMAIL_FROM
recipient_list = [email]
html_message = '<h3>您好{},欢迎来到工单系统找回密码!
请点击以下链接进行激活:</br>
<a href="http://127.0.0.1:8080/changepwd/?user_id={}">点击修改密码</a></h3>'
.format(username, user_id)
send_mail(
subject=subject,
message=message,
from_email=from_email,
recipient_list=recipient_list,
html_message=html_message
)
# celery -A dashixun worker -l info -P eventlet
以上a href 标签中的地址与自己前端页面对应根据自己的前端进行修改
以上最后一行代码为执行异步命令 将其中的dashixun替换成自己的项目名即可
View中发送邮箱接口
class Forgot_Password_View(APIView):
"""
发送邮箱
"""
def post(self, request):
username = request.data.get('username')
email = request.data.get('email')
print(username, email)
if not all([username, email]):
return Response({"msg": "参数不完整", "code": 400})
user_obj = User.objects.filter(username=username).first()
print(user_obj)
if user_obj:
send_mail_task.delay(username, email, user_obj.id)
return Response({"msg": "邮箱发送成功", "code": 200})
else:
return Response({'msg': "err"})
Views中修改密码接口
class ChangePwdView(APIView):
'''
修改密码
'''
def put(self,request):
uid = request.data.get('uid')
newpassword = request.data.get('password')
user_obj = User.objects.filter(id=uid).first()
if user_obj:
user_obj.password = make_password(newpassword)
user_obj.save()
return Response({'msg':'修改成功','code':200})
else:
# print(user_obj.errors)
return Response({'msg':'修改失败','code':400})
urls配置
urlpatterns = [
path('find/',Forgot_Password_View.as_view()), #发送邮件
path('change/',ChangePwdView.as_view()), #修改密码
]