如何让Django REST API将OPTIONS请求按POST请求方式处理?
让Django REST API的OPTIONS请求按POST逻辑处理的方案
方案1:重写视图的OPTIONS方法
默认的/api-token-auth/接口使用DRF的ObtainAuthToken视图,直接继承该视图并重写options方法,复用POST的处理逻辑即可:
from rest_framework.authtoken.views import ObtainAuthToken class CustomAuthToken(ObtainAuthToken): def options(self, request, *args, **kwargs): # 直接调用POST方法的业务处理逻辑 return self.post(request, *args, **kwargs)
之后在urls.py中替换原路由配置:
from django.urls import path from .views import CustomAuthToken urlpatterns = [ path('api-token-auth/', CustomAuthToken.as_view(), name='api_token_auth'), ]
方案2:用中间件批量转换OPTIONS请求
如果不想逐个修改视图,可以编写中间件,拦截指定路径的OPTIONS请求并将其方法改为POST:
from django.utils.deprecation import MiddlewareMixin class OptionsToPostMiddleware(MiddlewareMixin): def process_request(self, request): # 仅针对目标接口处理,避免影响其他路由 if request.path == '/api-token-auth/' and request.method == 'OPTIONS': request.method = 'POST'
将该中间件添加到settings.py的MIDDLEWARE列表中(注意要放在DRF相关中间件之前):
MIDDLEWARE = [ # ...其他系统中间件 'your_app_name.middleware.OptionsToPostMiddleware', # ...DRF的中间件,比如rest_framework.middleware.AuthenticationMiddleware ]
更优的规范做法
OPTIONS请求大多是浏览器跨域场景下的预检请求,按HTTP协议规范,这类请求应返回CORS允许的头部信息,而非执行业务逻辑。如果是跨域需求,更推荐使用django-cors-headers配置合理的CORS规则,让预检请求正常通过,而非强行让OPTIONS走POST流程——这能避免后续出现跨域相关的兼容性问题。
内容的提问来源于stack exchange,提问作者Uwe.Schneider
相关产品推荐
相关产品推荐

