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

如何用Python Requests模拟CORS预检请求测试DRF的CORS配置?

测试Django REST Framework的CORS配置&模拟带预检的POST请求

一、先测试CORS预检(OPTIONS请求)

浏览器的预检是自动触发的,直接用requests发送OPTIONS请求就能验证配置:

  • 必须带上Origin头(标识请求来源的前端域名),同时通过Access-Control-Request-Method告诉服务器后续要发起的请求方法(比如POST):
import requests

API_URL = "http://你的Django服务地址/目标接口/"
preflight_headers = {
    "Origin": "http://你的前端域名.com",
    "Access-Control-Request-Method": "POST",
    "Access-Control-Request-Headers": "Content-Type"  # 如果前端请求要带自定义头,这里要加上
}

# 发送预检请求
preflight_response = requests.options(API_URL, headers=preflight_headers)

检查响应头是否符合配置:

  • 确认存在Access-Control-Allow-Origin,值要么是你指定的前端域名,要么是*(如果配置了允许所有来源)
  • Access-Control-Allow-Methods必须包含POST
  • 如果指定了自定义头,Access-Control-Allow-Headers要包含对应的字段
  • 可选:Access-Control-Max-Age会返回预检结果的缓存时长,方便浏览器复用

二、发起带Origin的POST请求(模拟前端真实请求)

预检通过后,发送带Origin头的POST请求,验证是否能正常交互:

import requests

API_URL = "http://你的Django服务地址/目标接口/"
request_headers = {
    "Origin": "http://你的前端域名.com",
    "Content-Type": "application/json"
}
request_data = {"字段1": "值1", "字段2": "值2"}  # 你的请求数据

# 发送POST请求
post_response = requests.post(API_URL, json=request_data, headers=request_headers)

验证要点:

  • 响应状态码是否符合预期(比如200、201)
  • 响应头里的Access-Control-Allow-Origin是否和请求的Origin匹配

三、验证配置的边界场景

  • 用不在CORS_ALLOWED_ORIGINS里的域名发请求,应该返回403或者不带允许跨域的响应头
  • 测试其他请求方法(比如PUT/DELETE)的预检,确认配置的CORS_ALLOW_METHODS生效
  • 如果开启了CORS_ALLOW_CREDENTIALS = True,请求时要带上Cookie,同时响应头会返回Access-Control-Allow-Credentials: true,示例:
request_headers = {
    "Origin": "http://你的前端域名.com",
    "Content-Type": "application/json",
    "Cookie": "sessionid=xxx"
}
post_response = requests.post(API_URL, json=request_data, headers=request_headers, allow_redirects=True)

四、确认Django配置的正确性

确保你的settings.py配置没有问题:

INSTALLED_APPS = [
    # ...其他应用
    'corsheaders',
]

MIDDLEWARE = [
    # 注意:CorsMiddleware要放在CommonMiddleware之前
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    # ...其他中间件
]

# 允许的前端域名列表
CORS_ALLOWED_ORIGINS = [
    "http://你的前端域名.com",
    "http://localhost:3000",  # 开发环境的本地前端地址
]

# 开发环境可临时允许所有来源(生产环境禁用)
# CORS_ALLOW_ALL_ORIGINS = True

内容的提问来源于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:56:17