Django自定义用户认证对接REST API后send_data接口识别用户为匿名如何解决
问题根因
你遇到的send_data接口无法识别已登录用户的问题,核心有两个原因:一是函数视图未显式指定认证类,导致全局配置的JWT认证逻辑未正常触发;二是请求时未正确携带认证凭证。
解决方案
1. 给函数视图补充认证配置
你配置的全局默认认证类对@api_view装饰的函数视图同样生效,但为了避免规则覆盖导致失效,建议显式指定认证类,同时保留你原有的匿名用户可访问的逻辑:
首先补充导入依赖:
from rest_framework.decorators import authentication_classes, permission_classes from rest_framework.permissions import AllowAny from dj_rest_auth.jwt_auth import JWTCookieAuthentication
然后修改send_data的装饰器:
@api_view(http_method_names=["POST"]) @authentication_classes([JWTCookieAuthentication]) @permission_classes([AllowAny]) def send_data(request: Request) -> Response(): # 保留原有业务逻辑不变
2. 补充缺失的JWT配置
在settings.py的JWT相关配置段补充以下配置,解决本地开发Cookie无法携带的问题:
REST_USE_JWT = True JWT_AUTH_COOKIE = "my-app-auth" # 新增以下配置 JWT_AUTH_REFRESH_COOKIE = "my-refresh-token" JWT_AUTH_SAMESITE = "Lax" # 本地开发用http协议时设为False,生产环境切换为https后改成True JWT_AUTH_SECURE = False
如果你的项目是前后端分离跨域部署,还需要安装django-cors-headers完成跨域配置,开启Cookie跨域传输:
# settings.py 新增配置 INSTALLED_APPS += ["corsheaders"] MIDDLEWARE.insert(0, "corsheaders.middleware.CorsMiddleware") CORS_ALLOW_CREDENTIALS = True # 替换为你的前端实际访问地址 CORS_ALLOWED_ORIGINS = [ "http://localhost:8080", "http://127.0.0.1:8080", ]
3. 确保请求携带正确的认证凭证
- 如果是浏览器端访问:登录成功后会自动写入
my-app-authCookie,后续请求只要同域/跨域配置了withCredentials=true,会自动携带Cookie完成认证 - 如果是接口工具(Postman、Apifox)调用:先调用登录接口拿到Cookie,后续请求自动携带即可。如果需要支持请求头传Token的方式,可以在全局认证类中新增配置:
REST_FRAMEWORK = { "DEFAULT_AUTHENTICATION_CLASSES": [ "dj_rest_auth.jwt_auth.JWTCookieAuthentication", # 新增支持请求头传Token "rest_framework_simplejwt.authentication.JWTAuthentication", ], }
注意要先安装JWT依赖:pip install djangorestframework-simplejwt
内容的提问来源于stack exchange,提问作者bruvio
相关产品推荐
相关产品推荐

