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

问题描述

我很难找到造成这种情况的原因。我有一个带有令牌身份验证的心跳视图,它只返回 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/ Traceback(最近一次调用最后):文件“/home/ubuntu/virtenv/lib/python3.5/ site-packages/django/core/handlers/exception.py”,第 34 行,内部响应 = get_response(request) 文件“/home/ubuntu/virtenv/lib/python3.5/site-packages/django/core/handlers /base.py”,第 115 行,在 _get_response 响应 = self.process_exception_by_middleware(e, request) 文件“/home/ubuntu/virtenv/lib/python3.5/site-packages/django/core/handlers/base.py” ,第 113 行,在 _get_response response = 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(request, *args, **kwargs) 文件“/home/ubuntu/virtenv/lib/python3.5/site-packages/sentry_sdk/integrations/django/第 71 行,在视图中返回 self.dispatch(request, *args, **kwargs) 文件“/home/ubuntu/virtenv/lib/python3.5/site-packages/rest_framework/views.py”,第 495 行,在调度中response = 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(request, *args, **kwargs) 文件“/home/ubuntu/virtenv/lib/ python3.5/site-packages/sentry_sdk/integrations/django/第 71 行,在视图中返回 self.dispatch(request, *args, **kwargs) 文件“/home/ubuntu/virtenv/lib/python3.5/site-packages/rest_framework/views.py”,第 495 行,在调度中response = 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(request, *args, **kwargs) 文件“/home/ubuntu/virtenv/lib/ python3.5/site-packages/sentry_sdk/integrations/django/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(request, *args, **kwargs) 文件“/home/ubuntu/virtenv/lib/python3.5/站点包/sentry_sdk/integrations/django/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(request, *args, **kwargs) 文件“/home/ubuntu/virtenv/lib/python3.5/站点包/sentry_sdk/integrations/django/5/site-packages/sentry_sdk/integrations/django/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(request) 文件“/home/ubuntu/virtenv/lib/python3.5/site-packages/rest_framework/views.py”,第 326 行,在 perform_authentication request.user 文件“/home/ ubuntu/virtenv/lib/python3.5/site-packages/rest_framework/request.py”,第 223 行,在用户 self._authenticate() 文件“/home/ubuntu/virtenv/lib/python3.5/site-packages/ rest_framework/request.py”,第 383 行,在 _authenticate self.user,self.auth = user_auth_tuple 文件“/home/ubuntu/virtenv/lib/python3.5/site-packages/django/template/response.py”,第 120 行,在iter “必须先呈现响应内容,然后才能对其进行迭代。” django.template.response.ContentNotRenderedError:必须先渲染响应内容,然后才能对其进行迭代。

标签: pythondjangodjango-rest-framework

解决方案


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

raise exceptions.AuthenticationFailed('Your message here')

推荐阅读