空视图上的Django rest框架错误:必须先呈现响应内容,然后才能对其进行迭代

Posted

技术标签:

【中文标题】空视图上的Django rest框架错误:必须先呈现响应内容,然后才能对其进行迭代【英文标题】:Django rest framework error on empty view: the response content must be rendered before it can be iterated over 【发布时间】:2019-11-23 21:10:08 【问题描述】:

我很难找到造成这种情况的原因。我有一个带有令牌身份验证的心跳视图,它只返回 status=200 并且我得到 响应内容必须先呈现才能被迭代错误。

这与令牌身份验证有关,但对于我的生活,我无法弄清楚。

urlpatterns = [
    path('heartbeat/', views.HeartbeatView.as_view(), name='heartbeat')]


class TokenAuthentication(authentication.BaseAuthentication):
    def authenticate(self, request):
        auth_token = request.META.get('HTTP_AUTHTOKEN')
        if not auth_token:
            return Response('No token', status=450)
        try:
            auth_token_inst = AuthToken.objects.select_related('user').get(token=auth_token)
            if not auth_token_inst:
                return Response('Not a valid token', status=451)
            if auth_token_inst.is_active is False:
                return Response('Expired token', status=452)
            user = auth_token_inst.user
            auth_token_inst.ExtendExpireDate()
        except AuthToken.DoesNotExist:
            return Response('No token', status=450)

        return (user, None)

class HeartbeatView(APIView):
    authentication_classes = (TokenAuthentication,)

    def get(self, request):
        """
        Update token with heartbeat
        """
        return HttpResponse(status=200)

[15/Jul/2019 07:10:31] 错误 [django.request:228] 内部服务器错误:/heartbeat/ 回溯(最近一次通话最后): 文件“/home/ubuntu/virtenv/lib/python3.5/site-packages/django/core/handlers/exception.py”,第 34 行,在内部 响应 = get_response(请求) _get_response 中的文件“/home/ubuntu/virtenv/lib/python3.5/site-packages/django/core/handlers/base.py”,第 115 行 response = self.process_exception_by_middleware(e, request) _get_response 中的文件“/home/ubuntu/virtenv/lib/python3.5/site-packages/django/core/handlers/base.py”,第 113 行 响应 = Wrapped_callback(request, *callback_args, **callback_kwargs) 文件“/home/ubuntu/virtenv/lib/python3.5/site-packages/django/views/decorators/csrf.py”,第 54 行,位于 Wrapped_view 返回 view_func(*args, **kwargs) 文件“/home/ubuntu/virtenv/lib/python3.5/site-packages/django/views/generic/base.py”,第 71 行,在视图中 return self.dispatch(request, *args, **kwargs) 文件“/home/ubuntu/virtenv/lib/python3.5/site-packages/rest_framework/views.py”,第 495 行,在调度中 响应 = self.handle_exception(exc) 文件“/home/ubuntu/virtenv/lib/python3.5/site-packages/rest_framework/views.py”,第 455 行,在 handle_exception self.raise_uncaught_exception(exc) 文件“/home/ubuntu/virtenv/lib/python3.5/site-packages/rest_framework/views.py”,第 483 行,在调度中 self.initial(请求,*args,**kwargs) 文件“/home/ubuntu/virtenv/lib/python3.5/site-packages/sentry_sdk/integrations/django/init.py”,第 264 行,在 sentry_patched_drf_initial 返回 old_drf_initial(self, request, *args, **kwargs) 文件“/home/ubuntu/virtenv/lib/python3.5/site-packages/rest_framework/views.py”,第 400 行,初始 self.perform_authentication(请求) 文件“/home/ubuntu/virtenv/lib/python3.5/site-packages/rest_framework/views.py”,第 326 行,在 perform_authentication 请求用户 文件“/home/ubuntu/virtenv/lib/python3.5/site-packages/rest_framework/request.py”,第 223 行,在用户中 self._authenticate() _authenticate 中的文件“/home/ubuntu/virtenv/lib/python3.5/site-packages/rest_framework/request.py”,第 383 行 self.user,self.auth = user_auth_tuple iter 中的文件“/home/ubuntu/virtenv/lib/python3.5/site-packages/django/template/response.py”,第 120 行 “必须先呈现响应内容,然后才能对其进行迭代。” django.template.response.ContentNotRenderedError: 响应内容必须先渲染,然后才能迭代。

【问题讨论】:

返回HttpResponse('', status=200)是否有效? 还有,这是 django.http.HttpResponse 吗? @KhashayarGhamati 说了什么。 ;) 【参考方案1】:

我发现从 authentication.BaseAuthentication 的 authenticate 方法返回是错误的。最好的方法是引发这样的异常,否则事情会变得很奇怪。

raise exceptions.AuthenticationFailed('Your message here')

【讨论】:

以上是关于空视图上的Django rest框架错误:必须先呈现响应内容,然后才能对其进行迭代的主要内容,如果未能解决你的问题,请参考以下文章

django.test.client 上的 Django rest 框架导入错误

django rest框架:在视图中获取url路径变量

序列化程序django rest框架上的字段值属性错误

Django REST框架的嵌套API视图?

Django Rest 框架:支持任意 HTTP 动词的视图?

Django Rest框架 - 如果表包含响应显示服务器错误(500)的数据