Django 跨域组件 - django-cors-headers

6,257 阅读2分钟

MedusaSorcerer的博客


1. 简单介绍

如果你开发的项目出现了跨域问题, 那你可能需要 django-cors-headers 来解决你的烦恼, 它会添加 Cross-Origin Resource Sharing (CORS) 作为响应的标头, 以支持你从其他域上获取 Django 资源。 Github 地址

2. 安装

要求 Python 版本最低为 3.5
要求 Django 版本最低为 2.2
使用 Python-pip 安装:

python3 -m pip install django-cors-headers

3. 使用

在项目的 settings.py 应用中注册组件:

INSTALLED_APPS = [
    ...
    # 添加你定义的 APP 前面, 优先级更高
    'corsheaders',
    ...
]

在项目的 settings.py 中间件中注册组件:

MIDDLEWARE = [
    ...
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    ...
]

CorsMiddleware 应该尽可能放在前面, 使得它的优先级更高, 例如 Django 自带的 CommonMiddleware 或者 WhiteNoiseMiddleware, 另外, 如果你正在使用 CORS_REPLACE_HTTPS_REFERER 的话, 它的优先级应该在 CsrfViewMiddleware 的前面。

4. 配置参数说明

  • CORS_ORIGIN_ALLOW_ALL

    如果值是 True, 将不设置白名单, 将会允许所有请求访问资源。

  • CORS_ORIGIN_WHITELIST

    允许访问跨域资源的主机列表, 默认是 [], 例如:

    CORS_ORIGIN_WHITELIST  = [
        "http://127.0.0.1:9000"
    ]
    
  • CORS_ORIGIN_REGEX_WHITELIST

    使用正则匹配的方式建立白名单, 它将会和请求的 Origins 相匹配, 例如:

    CORS_ORIGIN_REGEX_WHITELIST  = [
        r"http://192\.168\.\d+\.\d+",
    ]
    
  • CORS_URLS_REGEX

    限制发送 CORS 标头的 URL 信息, 默认情况下是 r'^.*$' 意为允许所有的 URL 添加标头, 如果你只想在 /api/ 开头的 URL 添加标头的话, 你可以这样做:

    CORS_URLS_REGEX  =  r'^/api/.*$'
    
  • CORS_ALLOW_METHODS

    允许添加标头的请求方式, 默认为:

    CORS_ALLOW_METHODS  = [
        'DELETE''GET''OPTIONS''PATCH''POST''PUT',
    ]
    

    你可以导入默认配置, 那你也可以对他进行拓展, 并获取它的最新配置数据:

    from corsheaders.defaults import default_methods
    
    CORS_ALLOW_METHODS = list(default_methods) + [
        'POKE',
    ]
    
  • CORS_ALLOW_HEADERS

    发出实际请求时可以使用的非标准HTTP标头的列表, 默认为:

    CORS_ALLOW_HEADERS = [
        'accept',
        'accept-encoding',
        'authorization',
        'content-type',
        'dnt',
        'origin',
        'user-agent',
        'x-csrftoken',
        'x-requested-with',
    ]
    

    你也可以导入默认值, 进行拓展, 并获得最新的配置数据:

    from corsheaders.defaults import default_headers
    
    CORS_ALLOW_HEADERS = list(default_headers) + [
        'my-custom-header',
    ]
    
  • CORS_EXPOSE_HEADERS

    将向浏览器公开的HTTP标头列表, 默认是 []

  • CORS_PREFLIGHT_MAX_AGE

    客户端/浏览器可以缓存预检响应的秒数, 如果配置数据是 0 或者其他非法数值, 都不会发送最大期限标头, 默认情况下是一天:86400

  • CORS_ALLOW_CREDENTIALS

    如果为 True, 则将允许将 cookie 包含在跨站点的 HTTP 请求中, 默认为 False, 在 Django 2.1 中,添加了 SESSION_COOKIE_SAMESITE 设置, 默认情况下设置为 Lax, 这将防止 Django 的会话跨域发送, 设置为 None 可以绕过此安全限制。

  • CORS_REPLACE_HTTPS_REFERER

    CORS_REPLACE_HTTPS_REFERERTrue, 那么 CorsMiddleware 会将 Referer 头更改为每当 CORS 检查通过时都会通过 Django 的 CSRF 检查的内容, 默认为 False



2020 我们一起加油, 中国加油。