You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 11:40:05