我很难找到原因。我有一个带有令牌身份验证的心跳视图,它仅返回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:必须先呈现响应内容,然后才能对其进行迭代。
答案 0 :(得分:0)
我发现从authentication.BaseAuthentication的authenticate方法返回错误。最好的方法是引发这样的异常,否则事情会变得很奇怪。
raise exceptions.AuthenticationFailed('Your message here')