• 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,非常欢迎技术交流

  • 相关阅读:
    致命错误: mysql/mysql.h:没有那个文件或目录 解决办法
    [转载]解决/usr/bin/ld: cannot find lxxx 问题
    mysql5.5.25a安装:Installation of system tables failed解决办法
    ubuntu源码编译安装mysql5.5.25a
    ubuntu 11.10 安装配置NFS
    nrpe简单插件编写
    我也学erlang(五)——简单的列表处理
    C语言中自加与自减效率的思考
    DBI connect() failed: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'
    std::ostream_iterator用法
  • 原文地址:https://www.cnblogs.com/linpei/p/10490923.html
Copyright © 2020-2023  润新知