重写JSONWebTokenAPIView的post方法时出现CSRF令牌缺失/错误问题
解决JWT登录接口的CSRF Forbidden错误
首先,我注意到你的代码里有两个关键问题导致了这个CSRF错误,我们一步步来修复:
1. URL配置中缺少as_view()方法
类视图在Django的URL配置里不能直接使用类本身,必须调用as_view()方法来生成可调用的视图函数。你的urls.py里的配置写错了:
原代码:
path('login-jwt-over/', views.LoginDrfJwtView),
修正后:
path('login-jwt-over/', views.LoginDrfJwtView.as_view()),
这是非常常见的错误,没有调用as_view()会导致Django无法正确处理类视图的请求生命周期,进而触发不必要的CSRF验证。
2. 错误的super调用参数
你在重写post方法时,super的参数使用错误,这会导致没有正确调用父类ObtainJSONWebToken的post方法,而是直接跳到了更上层的父类方法,丢失了JWT视图自带的CSRF豁免逻辑。
原代码:
response = super(ObtainJSONWebToken, self).post(request, *args, **kwargs)
修正方式(二选一):
- Python 3 推荐写法(自动识别当前类和父类):
response = super().post(request, *args, **kwargs)
- 显式指定当前子类:
response = super(LoginDrfJwtView, self).post(request, *args, **kwargs)
额外注意:post方法返回值不合法
另外,我看到你在条件满足时返回了return True,这不符合DRF视图的要求——视图必须返回一个Response对象,而不是布尔值。你需要把这段代码改成返回合法的Response,比如:
if condition == True: # 你的自定义逻辑 return response # 或者构造新的Response对象(如Response({"msg": "success"}))
验证修复效果
把这两处错误修正后,重新启动服务,调用登录接口应该就不会再出现CSRF token缺失的错误了。本质上,ObtainJSONWebToken视图本身已经处理了CSRF豁免,但因为你的URL配置和super调用错误,导致这个逻辑没有生效。
内容的提问来源于stack exchange,提问作者Negiiii
相关产品推荐
相关产品推荐

