python - 错误:您的视图返回一个 HttpResponse 对象。相反,它返回了一个未等待的协程。您可能需要在视图中添加“等待”
问题描述
我正在开发一个 Django 项目,在该项目中我将一个事件添加到数据库中,然后在添加事件后向所有订阅者发送电子邮件。我想做异步发送电子邮件任务,我关注了一些博客文章并想出了这个。
from asgiref.sync import sync_to_async
import asyncio
这是添加事件视图
@login_required(login_url='/login/')
async def add_event_view(request):
if request.method == 'POST':
title = request.POST.get('title')
description = request.POST.get('editor')
menu = request.POST.get('menu')
tags = request.POST.get('tags')
banner = request.FILES.get('banner')
data = request.FILES.get('data', None)
organised_by = request.POST.get('organised_by', None)
sponsored_by = request.POST.get('sponsored_by', None)
event_date = request.POST.get('event_date', None)
uploaded_at = request.POST.get('uploaded_at')
Event.objects.create(user_id=request.user, event_title=title, event_description=description, event_category=menu, event_tags=tags,
event_banner=banner, event_data=data, organised_by=organised_by, sponsored_by=sponsored_by, event_date=event_date, uploaded_at=uploaded_at)
await sync_to_async(send_email(title))
return redirect(etab_view)
这是电子邮件发送功能
async def send_email(title):
event = Event.objects.get(event_title=title)
content = render_to_string("email.html", {'et': event})
subs = Subscriber.objects.values_list('email_address', flat=True)
email = EmailMultiAlternatives('Emagazine Update', content, settings.EMAIL_HOST_USER, list(subs))
email.attach_alternative(content, "text/html")
email.fail_silenty = False
email.send()
我收到以下错误:
视图 EMAG_APP.views.add_event_view 没有返回 HttpResponse 对象。相反,它返回了一个未等待的协程。您可能需要在视图中添加“等待”。
谁能帮我吗?
解决方案
问题似乎是login_required
装饰器当前不支持异步视图(请参阅https://code.djangoproject.com/ticket/31949)。该票中描述的一种解决方案是将函数包装在装饰器之前,然后将其解包:
import asyncio
from asgiref.sync import async_to_sync, sync_to_async
from django.contrib.auth.decorators import login_required
@sync_to_async
@login_required(login_url='/login/')
@async_to_sync
async def add_event_view(request):
...
推荐阅读
- android - 无法远程登录到作为服务器运行的 Xamarin Android 应用程序
- python - 序列化由 Flask 网站中的 sqlalchemy 数据库填充的可排序列表的顺序
- html - 停止输入框 HTML 上的文本溢出
- css - 页脚小部件 div 容器在其中显示重复的容器不知道为什么
- c# - 如何从 C# (SqlDependencyEx) 中的 XElement 对象中读取特定值
- php - 在保存 PostgresSQL 之前压缩字符串是否值得?
- laravel - withCount 和递归查询 Eloquent
- c# - 如何遍历枚举数组
- excel - 与 Excel 中的公式类型不匹配(错误 13)
- c# - C# 创建 24/32bit 声音 wav 文件