如何解决DRF 异常“NotAuthenticated”引发 500 内部服务器错误代替 401/403
我有一个 Django 中间件,用于验证 Firebase IDToken。
from rest_framework import exceptions
def process_request(request):
...
try:
decoded_token = auth.verify_id_token(id_token)
uid = decoded_token['uid']
except:
raise exceptions.NotAuthenticated(detail='not authenticated')
当验证失败时,auth 会引发异常,该异常会被 try except 块捕获。但不是引发 401/403 错误,而是由 NotAuthenticated 引发 500 Internal Server Error。
这是因为 DRF Exceptions 的一些工作导致这种情况发生吗?
解决方法
DRF handles sending status code 401 or 403 取决于从您的视图引发的异常 (NotAuthenticated
,PermissionDenied
)。
但是由于您使用的是中间件,因此 DRF 已经不在考虑范围内。您引发的任何默认情况下未捕获或处理的异常都将被视为服务器错误,因此会给您一个 500
。
如果您希望您的中间件返回 401 或 403,您可以像这样使用 django 的 HttpResponse
或 HttpResponseForbidden
:
from django.http.response import HttpResponse,HttpResponseForbidden
class MyMiddlware:
def process_request(request):
try:
decoded_token = auth.verify_id_token(id_token)
uid = decoded_token['uid']
except Exception:
return HttpResponseForbidden('not authenticated')
# or return HttpResponse('not authenticated',status=401)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。