Django实现返回JSON响应的异步函数遇协程无get属性500错误
Django异步视图返回
coroutine has no attribute get报错解决办法 该报错核心原因是Django处理视图返回结果时,拿到的是未被执行的协程对象而非合法的HttpResponse实例,后续流程尝试调用响应对象的get方法(用于处理响应头、cookie等逻辑)时触发属性不存在异常。
排查步骤
- 第一步:检查路由注册逻辑
确保urls.py中注册视图时直接传入函数对象,不要额外加括号执行视图。正确写法示例:
如果错误写成urlpatterns = [ # 正确:传入函数对象,不要写get_poi() path('api/get-poi/', get_poi, name='get_poi'), ]get_poi(),会直接执行视图得到协程对象,直接触发报错。 - 第二步:检查Django版本
只有Django 3.1及以上版本原生支持异步视图,如果使用的是更低版本,可选择升级Django,或者直接使用同步视图不需要额外封装sync_to_async。 - 第三步:检查运行的服务器类型
异步视图必须运行在ASGI服务器上(如Uvicorn、Daphne),如果使用传统WSGI服务器(如同步模式Gunicorn、旧版默认runserver),Django不会自动处理协程返回值,也会触发该错误。本地测试可使用以下命令启动ASGI服务:python -m uvicorn 你的项目名.asgi:application
优化写法参考
你也可以调整为更规范的异步视图写法,减少出错概率:
from asgiref.sync import sync_to_async from django.http import JsonResponse from django.core.serializers import serialize from .models import Poi async def get_poi(request): @sync_to_async def query_poi_data(): context = {} poi_ids = request.GET.getlist('poi_ids[]') if len(poi_ids) > 0: poi_list = serialize( 'geojson', Poi.objects.filter(id__in=poi_ids).distinct('name'), geometry_field='geom', fields=('name',) ) context['poi_list'] = poi_list return context context = await query_poi_data() return JsonResponse(context)
内容的提问来源于stack exchange,提问作者Dimitris Kougioumtzis
相关产品推荐
相关产品推荐

