cors是什么?需要如何开启呢?
Django是python的web框架,用于快速构建web应用。在Django里面的应用有时候可能需要与其他不同域的主机应用进行通信,为了保证这些请求都能成功,你需要在你的服务里面使用cross-origin resource sharing (CORS)跨域请求。
幸运的是,Django已经拥有这个模块,更容易安装和配置允许跨域请求和避免错误。因此,如果你想更好的了解CORS模块及如何在Django服务中使用,那么你继续往下读。
什么是CORS?
CORS是一种允许不同域主机资源通信的机制。例如,使用Ajax请求是一种常用的方式。
为了更好的阐述CORS如何工作,让我们假设一套web应用并绑定域名为domain.com,但是,为了节约用户信息,应用调用托管在另一个URL中的API上,例如:api.domain.com。当一个请求保存数据到api.domain.com上时,这时候服务会验证请求的头信息和请求资源。
如果允许这个URL domain.com访问,它将返回正确的响应。如果这个域不允许,这个服务会返回错误。这些信息都是使用HTTP头信息进行交流的。
涉及CORS的错误
CORS是Web客户端(浏览器)实现的一项安全功能,可以向特定服务器发出失败的请求。一些服务器可能的响应包括以下
- 没有授权状态(403)
- 预检请求中的错误,指示哪些URL可以发送CORS请求
做一个说明,预检请求是一个浏览器发送到服务端用于发现HTTP方法接收请求。那么,服务会返回错误状态和启用CORS URL列表信息,如果这个服务不包含在这个域策略的请求中,浏览器甚至不会执行实际的数据请求。
根据经验,如果你处理不同域的请求,你需要记住要关注CORS问题,要记住,使用不同的HTTP协议,甚至不同的端口都算作不同的域。但是不需要担心,目前浏览器会很好的判断这类问题。
Django中开启CORS
从Django成为一套web框架时,它非常容易开启CORS,接来下做以下步骤:
- 安装CORS模块
python -m pip install django-cors-headers
- 在Django里面开启,需要再install apps选项里面操作,否则,你会出现错误。
INSTALLED_APPS = [
...
'corsheaders',
...
]
- 下面,添加到中间件中,中间件类可以被Django请求和返回操作触发
MIDDLEWARE = [
...,
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...,
]
我推荐在其他中间件前面引用,防止其他中间件会阻止CORS头信息。
必要设置
你可以将模块设置为允许来自特定域、正则表达式或所有请求的请求。应配置哪些选项将取决于后端的用途。有时所有来源都是有效的,但在其他情况下,你需要将它们缩小到只有几个选项,如下所示。
- CORS_ALLOWED_ORIGINS
允许授权来源请求策略,我这里例举4个来源:
CORS_ALLOWED_ORIGINS = [
"https://domain.com",
"https://api.domain.com",
"http://localhost:8080",
"http://127.0.0.1:9000"
]
- CORS_ALLOWED_ORIGIN_REGEXES
信息来源可以使用正则匹配策略
CORS_ALLOWED_ORIGIN_REGEXES = [
r"^https://\w+\.domain\.com$",
]
- 所有来源配置策略,为true全部,false为不允许
CORS_ALLOW_ALL_ORIGINS = True
- Optional Parameters 可选参数
可选参数已具有默认值,这些默认值在大多数情况下都有效。但是,如果您需要其他细粒度权限,则可以使用这些设置。使用它们,您可以根据 URL 限制 CORS 响应。此外,您可以允许特定操作(GET、POST、PUT 等)、请求的特定标头,甚至是 cookie。让我们回顾一下参数。
- CORS_URLS_REGEX (URL正则)
针对URL路由进行正则匹配
CORS_URLS_REGEX = r'^/api/.*$'
- CORS_ALLOW_METHODS 限制跨域请求方法
CORS_ALLOW_METHODS = [
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
]
- CORS_ALLOW_HEADERS 允许头信息
CORS_ALLOW_HEADERS = [
'accept',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
]
- CORS_EXPOSE_HEADERS
CORS_EXPOSE_HEADERS是向浏览器公开的标头列表。默认值为空数组。
- CORS_PREFLIGHT_MAX_AGE
定义缓存头信息预检保留最大时间,默认最大86400秒(一天)
- CORS_ALLOW_CREDENTIALS
CORS_ALLOW_CREDENTIALS是真值或假值。其值确定服务器是否允许跨站点 HTTP 请求中的 cookie。
最终思想
CORS 是一项旨在保护用户免受恶意网站侵害的安全功能。在这种情况下,保护是只允许特定域执行 CORS 请求。因此,后端服务器需要适当的配置才能接受此类请求。
然而,此功能有时会妨碍您的项目开发过程。要配置开发环境,您需要考虑 CORS 要求的安全限制。这让它有点棘手。但是一旦你正确地配置它,你就可以忘记它了。
不过,如果在生产环境中部署应用后所有请求都来自同一域,请不要忘记禁用它。否则,请确保正确配置它以避免意外错误。正如我上面所解释的,对于Django,这一步非常容易做到。