空视图上的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 框架导入错误