如何使用Django的异步视图异步发送邮件?

c3frrgcw  于 2023-02-25  发布在  Go
关注(0)|答案(1)|浏览(475)

我正在生成项目,希望在用户执行特定操作时发送通知电子邮件。
我做了一些搜索,并设法实现这一点使用threading.Thread。由于Django现在完全支持异步视图,我想这样做的异步函数。
下面是我的尝试:

from asgiref.sync import sync_to_async
from django.core.mail import send_mail
from django.shortcuts import render
from myproj.settings import EMAIL_HOST_USER
import asyncio

asend_mail = sync_to_async(send_mail)

async def index(request):
    asyncio.create_task(
        asend_mail(
            subject='Test',
            message='Lorem ipsum',
            from_email=EMAIL_HOST_USER,
            recipient_list=['ezon@stackoverflow.dummy']
        )
    )
    return render(request, 'myapp/index.html', {})

然而,当我请求这个索引页时,我仍然在asend_mail协程完成后得到响应。
我已经尝试了以下简单的异步函数(来自一个教程),一切都按预期工作。

async def async_print():
    for num in range(1, 6):
        await asyncio.sleep(1)
        print(num)

async def index(request):
    asyncio.create_task(async_print())
    return render(request, 'myapp/index.html', {})

我想知道上述两种情况的关键区别是什么。
我使用的是python 3.10.7,django 4.1.2,daphne 3.0.2(作为服务器,而不是django的开发服务器)。
我是异步/等待特性的新手。如果有人能给出一个全面的解释,我将不胜感激。

2ledvvac

2ledvvac1#

我会尝试线程(请参见:https://realpython.com/intro-to-python-threading/用于参考)
我用它上传了1000个(大)文件到一个S3的存储桶里,比按顺序上传快了70倍。
这个想法是,这个电子邮件任务将被 Package 在一个线程中,线程将被发出,你的代码将从那里继续,而不是等待任务(在线程中)完成。

相关问题