python - 空视图上的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:必须先渲染响应内容,然后才能对其进行迭代。
解决方案
我发现从 authentication.BaseAuthentication 的身份验证方法返回是错误的。最好的方法是引发这样的异常,否则事情会变得很奇怪。
raise exceptions.AuthenticationFailed('Your message here')
推荐阅读
- r - 使用 xml 问题将文本读入 R
- excel - VBA代码提示任何用户选择源文件夹和目标文件夹
- ruby-on-rails - 在 Rails 中向 Devise Model 添加多对多关系时遇到问题
- corda - Corda 4.0 版本的升级合同
- laravel - 如何修复此工厂代码并返回带有特定查询的用户
- r - 尽管 enquo() 在函数中使用 dplyr 会引发错误
- python - 按pyspark中字典列表中的值过滤数据框
- python - 使用矩阵第一行的值作为 matplotlib.pyplot.imshow 的刻度
- html - 如何减少时间线面板的分离 Bootstrap
- authorization - 如何使用受 B2C 保护的 Web API 授权计划任务?