Cross-Origin Resource Sharing (CORS):
Cross-Origin Resource Sharing跨域资源共享
需要Python 3.5 to 3.8版本,Django 1.11 to 3.0 版本:
- 下载django-cors-headers
python -m pip install django-cors-headers
- 将corsheaders添加进设置settings中的INSTALLED_APPS
INSTALLED_APPS = [
...
'corsheaders',
...
]
- 添加中间件,监听响应,它的位置越高越好,特别是在任何可以生成响应的中间件之前,比如Django的CommonMiddleware。如果不是在此之前,它将无法将CORS标头添加到这些响应中。。
MIDDLEWARE = [
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
]
- 添加白名单:设置settings中添加允许访问的hosts
需设置的参数有三个:
CORS_ORIGIN_WHITELIST=[] # 默认列表是空;
CORS_ORIGIN_ALLOW_ALL=False # 默认值为False;
CORS_ORIGIN_REGEX_WHITELIST==False # 默认值为False。
方式一:设置允许所有的hosts访问
CORS_ORIGIN_ALLOW_ALL=TRUE
方式二:指定的hosts允许访问,添加格式:URI方案(协议:http或https等)+主机名(或者IP)+端口
# Example
CORS_ORIGIN_WHITELIST = [
"https://example.com",
"https://sub.example.com",
"http://localhost:8080",
"http://127.0.0.1:9000"
]
注意:当有大量的子域时,可以设置正则表达式进行匹配允许访问的hosts
# Example
CORS_ORIGIN_REGEX_WHITELIST = [
r"^https://\w+\.example\.com$",
]
- 如果有其他的需求外,可以在添加optional选项进行补充(非必选设置)
(1)如:当指允许hosts中的某些接口进行访问时候
# 默认是匹配所有:r'^.*$'
CORS_URLS_REGEX= r'^/api/.*$'
(2)如:当只允许指定的方法(‘GET’,‘POST’)进行访问的时候:
# 默认方法有:'DELETE','GET','OPTIONS','PATCH','POST','PUT'
CORS_ALLOW_METHODS = [
'GET',
'POST'
]
如果默认的方法不满足,需要自定义方法,可以在自己的项目中用下面的代码编写
from corsheaders.defaults import default_methods
CORS_ALLOW_METHODS = list(default_methods) + [
'POKE',
]
(3)如:可以自定义允许访问的HEADERS
# 默认的CORS_ALLOW_HEADERS类表如下:
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',
]
还有很多其他的设置,可以自行查阅文档: