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

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的版本可选:

  1. 安装兼容版本(支持Django 1.6):

    pip install django-cors-headers==1.1.0
    
  2. 修改项目根目录的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中间件:

  1. 在项目根目录创建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
    
  2. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:56:33