django-cors-headers处理跨域请求,一个为响应添加跨源资源共享(CORS)头的Django应用。这允许从其他源向Django应用程序发出浏览器内请求。
来源github: django-cors-headers
pip install django-cors-headers
INSTALLED_APPS = [
...
'corsheaders',
...
]
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware', # 放最前面
...
]
# 如果为True,则将不使用白名单,并且将接受所有来源。默认为False
CORS_ORIGIN_ALLOW_ALL = True
CORS_ORIGIN_WHITELIST = [
"https://example.com",
"https://sub.example.com",
"http//localhost:8080",
"http://127.0.0.1:9000",
]
CORS_ORIGIN_REGEX_WHITELIST = [
r"^https://\w+\.example\.com$",
]
CORS_URLS_REGEX: 只需要在网站的一部分上使用CORS时很有用,例如位于的API /api/。
CORS_URLS_REGEX = r'^/api/.*$'
CORS_ALLOW_METHODS: 实际请求所允许的HTTP动词列表。
# 默认为
# CORS_ALLOW_METHODS = [
# 'DELETE',
# 'GET',
# 'OPTIONS',
# 'PATCH',
# 'POST',
# 'PUT',
# ]
# 自定义所允许的http动词列表
from corsheaders.defaults import default_methods
CORS_ALLOW_METHODS = list(default_methods) + [
'POKE',
]
# 默认为:
CORS_ALLOW_HEADERS = [
'accept',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
]
# 自定义http标头
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(一天)。
注意:预检请求是在发出“不太简单”的请求(例如Content-Type,不是 application/x-www-form-urlencoded)时确定的,它是确定服务器实际接受的请求的额外请求。
在Django 2.1中,添加了SESSION_COOKIE_SAMESITE设置,'Lax’默认情况下设置为 ,这将防止Django的会话cookie跨域发送。更改它以None绕过此安全限制。
大多数站点都需要利用Django提供的跨站点请求伪造保护。CORS和CSRF是分开的,并且Django无法使用您的CORS配置免除网站Referer对安全请求所做的检查。做到这一点的方法是使用其CSRF_TRUSTED_ORIGINS设置。例如:
CORS_ORIGIN_WHITELIST = [
'http://read.only.com',
'http://change.allowed.com',
]
CSRF_TRUSTED_ORIGINS = [
'change.allowed.com',
]
CSRF_TRUSTED_ORIGINS是Django 1.9中引入的,因此早期版本的用户将需要替代解决方案。如果CORS_REPLACE_HTTPS_REFERER为 True,CorsMiddleware则将Referer标头更改为每当CORS检查通过时将通过Django的CSRF检查的内容。默认为 False。
请注意,与不同CSRF_TRUSTED_ORIGINS,此设置不允许您区分CORS 信任读取资源的域和避免CSRF保护而信任更改资源的域。
启用此功能corsheaders.middleware.CorsPostCsrfMiddleware后django.middleware.csrf.CsrfViewMiddleware,还应该在之后 添加,MIDDLEWARE_CLASSES以撤消Referer替换:
MIDDLEWARE_CLASSES = [
...
'corsheaders.middleware.CorsMiddleware',
...
'django.middleware.csrf.CsrfViewMiddleware',
'corsheaders.middleware.CorsPostCsrfMiddleware',
...
]