You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 01:15:05