Django1.6集成DRF3.2.5与Swagger0.3.6远程服务器CORS问题求助
解决Django 1.6 + DRF + Swagger远程服务器CORS错误的具体方案
这是典型的**跨域资源共享(CORS)**问题——当Swagger UI在远程环境下请求API文档时,浏览器的同源策略会阻止跨域请求,导致你看到的提示。结合你使用的老版本技术栈(Django 1.6、DRF 3.2.5、Swagger 0.3.6),给你三个可行的配置方案:
方案1:使用兼容的django-cors-headers库
这是最省心的方式,专门处理Django的CORS问题,且有适配老版本Django的版本可选:
安装兼容版本(支持Django 1.6):
pip install django-cors-headers==1.1.0修改项目根目录的
settings.py:- 将
corsheaders添加到INSTALLED_APPS:INSTALLED_APPS = ( # 其他已有的app... 'corsheaders', ) - 将CORS中间件添加到
MIDDLEWARE_CLASSES(注意要放在CommonMiddleware之前):MIDDLEWARE_CLASSES = ( 'corsheaders.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware', # 其他已有的中间件... ) - 配置CORS规则:
# 测试环境可以允许所有源(生产环境不建议) CORS_ORIGIN_ALLOW_ALL = True # 生产环境请指定具体的前端域名,比如: # CORS_ORIGIN_WHITELIST = ( # 'your-swagger-ui-domain.com', # 'your-frontend-app.com', # ) # 允许的HTTP方法 CORS_ALLOW_METHODS = ('GET', 'POST', 'OPTIONS', 'PUT', 'PATCH', 'DELETE')
- 将
方案2:自定义Django中间件
如果不想引入第三方库,可以自己写一个极简的CORS中间件:
在项目根目录创建
middleware.py文件,写入以下代码:class CorsMiddleware(object): def process_response(self, request, response): # 生产环境替换为你的Swagger UI域名 response['Access-Control-Allow-Origin'] = '*' response['Access-Control-Allow-Methods'] = 'GET, POST, OPTIONS, PUT, PATCH, DELETE' response['Access-Control-Allow-Headers'] = 'Content-Type, Authorization' # 处理OPTIONS预检请求,直接返回200状态码 if request.method == 'OPTIONS': response.status_code = 200 return response在
settings.py的MIDDLEWARE_CLASSES中添加这个中间件:MIDDLEWARE_CLASSES = ( 'your_project_name.middleware.CorsMiddleware', # 替换为你的项目名 'django.middleware.common.CommonMiddleware', # 其他中间件... )
方案3:在服务器反向代理层配置CORS
如果你的远程服务器用了Nginx或Apache作为反向代理,可以直接在服务器层面添加CORS响应头,无需修改Django代码:
Nginx配置示例
在你的API站点的location块中添加:
location / { # 其他已有配置... add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS, PUT, PATCH, DELETE'; add_header Access-Control-Allow-Headers 'Content-Type, Authorization'; # 处理OPTIONS预检请求,直接返回204 if ($request_method = OPTIONS) { return 204; } }
Apache配置示例
在你的虚拟主机配置中添加:
Header set Access-Control-Allow-Origin "*" Header set Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, PATCH, DELETE" Header set Access-Control-Allow-Headers "Content-Type, Authorization" # 处理OPTIONS请求 RewriteEngine On RewriteCond %{REQUEST_METHOD} OPTIONS RewriteRule ^(.*)$ $1 [R=200,L]
注意事项
- 生产环境绝对不要使用
*允许所有源,一定要指定具体的域名列表,避免安全风险。 - 如果你在Swagger中配置了自定义的API base路径,要确保路径和CORS配置的域名匹配。
- 配置完成后,记得重启Django服务或反向代理服务器,让配置生效。
内容的提问来源于stack exchange,提问作者Stan Reduta
相关产品推荐
相关产品推荐

