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_REFERER
为True
, 那么CorsMiddleware
会将Referer
头更改为每当 CORS 检查通过时都会通过 Django 的 CSRF 检查的内容, 默认为False
。
2020 我们一起加油, 中国加油。