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

时间:2019-07-15 07:30:59

标签: python django django-rest-framework

我很难找到原因。我有一个带有令牌身份验证的心跳视图,它仅返回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行       响应= self.process_exception_by_middleware(e,请求)     _get_response中的文件“ /home/ubuntu/virtenv/lib/python3.5/site-packages/django/core/handlers/base.py”,第113行       响应= wraped_callback(请求,* 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行       返回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)     在sendry_patched_drf_initial中的第264行中,文件“ /home/ubuntu/virtenv/lib/python3.5/site-packages/sentry_sdk/integrations/django/init.py”       返回old_drf_initial(自己,请求,* args,** kwargs)     最初的文件“ /home/ubuntu/virtenv/lib/python3.5/site-packages/rest_framework/views.py”,第400行       self.perform_authentication(请求)     在perform_authentication中的第326行中,文件“ /home/ubuntu/virtenv/lib/python3.5/site-packages/rest_framework/views.py”       request.user     用户中的文件“ /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      it 中的文件“ /home/ubuntu/virtenv/lib/python3.5/site-packages/django/template/response.py”,第120行       “必须对响应内容进行渲染,然后才能对其进行迭代。”   django.template.response.ContentNotRenderedError:必须先呈现响应内容,然后才能对其进行迭代。

1 个答案:

答案 0 :(得分:0)

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

raise exceptions.AuthenticationFailed('Your message here')