zoukankan      html  css  js  c++  java
  • Django+celery+redis 异步发送邮件功能

    系统==win10

    Django==2.1

    redis==  3.2.0

    celery==4.2.1

    由于目前是在开发过程中,所以测试环境为win10。

    开发需求:当用户在页面点击“下载时”,系统会通过用户session获取用户邮箱,使用系统设置的邮箱发送给用户包含指定文件的邮件。

    问题1:views.py中,除非系统将邮件已成功发送,才会return页面给用户,由于文件大小和网络环境的问题,发送时间可能较长,不可能让用户长时间等待。

    问题2:系统发送邮件的主进程进行时,用户和其他人都无法做新的操作。

    解决办法:使用celery将发送邮件的任务转成异步执行,无需用户等待。使用redis作为队列,将异步任务进行缓存。不影响服务器主进程。

    开始解决之路:

    部署环境

    pip3 install redis   (这里首先需要下载redis安装,下载链接https://github.com/MicrosoftArchive/redis/releases,进入后下载Redis-x64-3.2.100.zip),启动命令: 进入解压后的文件 输入:redis-server.exe redis.windows.conf

    pip3 install celery  

    目录结构见下图:

    将创建两个py文件,tasks.py和celery.py。

    tasks.py 内容

    from django.conf import settings
    from django.core.mail import EmailMessage
    from Scitylab.celery import app
    
    @app.task
    def send_mail():
        print('**************开始生成消息*****************')
        subject = 'test'
        text_content = '这是一封重要的报告邮件.'
        from_email = settings.EMAIL_HOST_USER
        msg = EmailMessage(subject,
                           text_content,
                           from_email,
                           ['*******@qq.com', ])
    
        msg.send(fail_silently=False)

    celery.py 内容

    from __future__ import absolute_import
    
    import os
    import django
    from celery import Celery
    from django.conf import settings
    
    os.environ.setdefault('DJANGO_SETTINGS_MODULE','Scitylab.settings')
    django.setup()
    
    app = Celery('Scitylab')
    
    app.config_from_object('django.conf:settings')
    app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

    setting.py 添加的内容为

    BROKER_URL = 'redis://localhost:6379/0'
    BROKER_TRANSPORT = 'redis'

    views.py内容为

    from django.shortcuts import render, redirect
    from website import models
    from .tasks import send_mail
    
    def download(req):
        if req.method == "POST":
                send_mail.delay()
                return redirect('/html/download/')
        return render(req, "download.html")

    django 启动项目(命令:python manage.py runserver 0.0.0.0:8000)后,开启redis数据库(命令:redis-server.exe redis.windows.conf),然后开发celery服务(命令:celery -A Scitylab worker -l debug)

    到此为止,还有一个问题,由于测试环境为win10,celery4.2是不支持win10的,所以,还需要执行pip3 install gevent  (因为啥我也不知道,google出来的),将celery开启worker的命令改为:celery -A Scitylab worker -l debug -P gevent

    有什么问题请随时联系,邮箱1005819387@qq.com,非常欢迎技术交流

  • 相关阅读:
    hive数据类型
    hive类型转化错误,会错误提示指定分区参数
    [ORACLE]java.sql.SQLRecoverableException: IO Error: Connection rese
    oracle start with connect by prior 递归查询用法
    redis参数改进建议
    Android Studio教程--从Github 下载一个Repository
    Android Studio教程--Android项目分享到Github
    Android Studio Gradle Build Running 特别慢的问题探讨
    The Genymotion Virtual device could not obtain an IP address解决办法
    Android Studio教程--给Android Studio安装Genymotion插件
  • 原文地址:https://www.cnblogs.com/linpei/p/10490923.html
Copyright © 2011-2022 走看看