django-cors-headers 是一个 Django 应用程序,用于处理跨域资源共享 (CORS) 所需的服务器标头。
python -m pip install django-cors-headers
然后在项目的seting.py 文件下添加如下信息
INSTALLED_APPS = [
...
'corsheaders' ,
...
]
确保添加尾随逗号,否则可能会收到ModuleNotFoundError
错误提示
还需要在项目的seting.py文件下添加一个中间件类来监听响应
MIDDLEWARE = [
...
'corsheaders.middleware.CorsMiddleware' ,
'django.middleware.common.CommonMiddleware' ,
...
]
CorsMiddleware
应放在尽可能高,特别是可以产生如Django的回应任何中间件之前,入上文中的django.middleware.common.CommonMiddleware
在 Django 设置中配置中间件的行为。必须至少设置以下三个设置之一:
CORS_ALLOWED_ORIGINS
CORS_ALLOWED_ORIGIN_REGEXES
CORS_ALLOW_ALL_ORIGINS
CORS_ALLOWED_ORIGINS
授权发出跨站点 HTTP 请求的源列表。默认为[]
。
例子:
CORS_ALLOWED_ORIGINS = [
"https://example.com" ,
"https://sub.example.com" ,
"http://localhost:8080" ,
"http://127.0.0.1:9000"
]
以前这个设置被称为CORS_ORIGIN_WHITELIST
,它仍然作为别名使用,新名称优先。
CORS_ALLOWED_ORIGIN_REGEXES
表示与 Origins 匹配的正则表达式的字符串列表,这些 Origins 被授权发出跨站点 HTTP 请求。默认为[]
。当CORS_ALLOWED_ORIGINS
不切实际时 很有用
,例如当您有大量子域时。
例子:
CORS_ALLOWED_ORIGIN_REGEXES = [
r "^https://\w+\.example\.com$" ,
]
以前此设置称为CORS_ORIGIN_REGEX_WHITELIST
,它仍然用作别名,新名称优先。
CORS_ALLOW_ALL_ORIGINS
如果为True
,则将允许所有来源。其他限制允许来源的设置将被忽略。默认为False
。
将此设置为True
可能很危险,因为它允许任何网站向您的网站发出跨域请求。通常,您需要使用CORS_ALLOWED_ORIGINS
或 CORS_ALLOWED_ORIGIN_REGEXES
来限制允许来源的列表。
以前这个设置被称为CORS_ORIGIN_ALLOW_ALL
,它仍然作为别名使用,新名称优先。
以下是可选设置,默认值可能就足够了。
CORS_URLS_REGEX
限制将发送 CORS 标头的 URL 的正则表达式。默认为r'^.*$'
,即匹配所有 URL。当您只需要在站点的一部分上使用 CORS 时很有用,例如/api/ 中
的 API 。
例子:
CORS_URLS_REGEX = r '^/api/.*$'
CORS_ALLOW_METHODS
允许用于实际请求的 HTTP 动词列表。默认为:
CORS_ALLOW_METHODS = [
'DELETE' ,
'GET' ,
'OPTIONS' ,
'PATCH' ,
'POST' ,
'PUT' ,
]
默认值可以作为corsheaders.defaults.default_methods
导入,因此您可以使用自定义方法对其进行扩展。这使您可以跟上任何未来的变化。例如:
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' ,
]
默认值可以作为corsheaders.defaults.default_headers
导入,因此您可以使用自定义标头对其进行扩展。这使您可以跟上任何未来的变化。例如:
from corsheaders.defaults import default_headers
CORS_ALLOW_HEADERS = list(default_headers) + [
'my-custom-header',
]
CORS_EXPOSE_HEADERS
要向浏览器公开的 HTTP 标头列表。默认为 []
。
CORS_PREFLIGHT_MAX_AGE
客户端/浏览器可以缓存预检响应的秒数。如果这是 0(或任何 falsey 值),则不会发送最大年龄标头。默认为 86400
(一天)。
CORS_ALLOW_CREDENTIALS
如果为True
,将允许 cookie 包含在跨站点 HTTP 请求中。默认为False
。
注意:在 Django 2.1中添加了SESSION_COOKIE_SAMESITE设置,默认设置为 “Lax”
,这将防止 Django 的会话 cookie 被跨域发送。将其更改为None
以绕过此安全限制。