如何用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
相关产品推荐
相关产品推荐

