Django CORS指南

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,接来下做以下步骤:

  1. 安装CORS模块
python -m pip install django-cors-headers
  1. 在Django里面开启,需要再install apps选项里面操作,否则,你会出现错误。
INSTALLED_APPS = [
...
'corsheaders',
...
]
  1. 下面,添加到中间件中,中间件类可以被Django请求和返回操作触发
MIDDLEWARE = [
...,
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...,
]

我推荐在其他中间件前面引用,防止其他中间件会阻止CORS头信息。

必要设置

你可以将模块设置为允许来自特定域、正则表达式或所有请求的请求。应配置哪些选项将取决于后端的用途。有时所有来源都是有效的,但在其他情况下,你需要将它们缩小到只有几个选项,如下所示。

  1. CORS_ALLOWED_ORIGINS

允许授权来源请求策略,我这里例举4个来源:

CORS_ALLOWED_ORIGINS = [
"https://domain.com",
"https://api.domain.com",
"http://localhost:8080",
"http://127.0.0.1:9000"
]
  1. CORS_ALLOWED_ORIGIN_REGEXES

信息来源可以使用正则匹配策略

CORS_ALLOWED_ORIGIN_REGEXES = [
r"^https://\w+\.domain\.com$",
]
  1. 所有来源配置策略,为true全部,false为不允许
CORS_ALLOW_ALL_ORIGINS = True
  1. Optional Parameters 可选参数

可选参数已具有默认值,这些默认值在大多数情况下都有效。但是,如果您需要其他细粒度权限,则可以使用这些设置。使用它们,您可以根据 URL 限制 CORS 响应。此外,您可以允许特定操作(GET、POST、PUT 等)、请求的特定标头,甚至是 cookie。让我们回顾一下参数。

  1. CORS_URLS_REGEX (URL正则)

针对URL路由进行正则匹配

CORS_URLS_REGEX = r'^/api/.*$'
  1. CORS_ALLOW_METHODS 限制跨域请求方法
CORS_ALLOW_METHODS = [
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
]
  1. CORS_ALLOW_HEADERS 允许头信息
CORS_ALLOW_HEADERS = [
'accept',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
]
  1. CORS_EXPOSE_HEADERS

CORS_EXPOSE_HEADERS是向浏览器公开的标头列表。默认值为空数组。

  1. CORS_PREFLIGHT_MAX_AGE

定义缓存头信息预检保留最大时间,默认最大86400秒(一天)

  1. CORS_ALLOW_CREDENTIALS

CORS_ALLOW_CREDENTIALS是真值或假值。其值确定服务器是否允许跨站点 HTTP 请求中的 cookie。

最终思想

CORS 是一项旨在保护用户免受恶意网站侵害的安全功能。在这种情况下,保护是只允许特定域执行 CORS 请求。因此,后端服务器需要适当的配置才能接受此类请求。

然而,此功能有时会妨碍您的项目开发过程。要配置开发环境,您需要考虑 CORS 要求的安全限制。这让它有点棘手。但是一旦你正确地配置它,你就可以忘记它了。

不过,如果在生产环境中部署应用后所有请求都来自同一域,请不要忘记禁用它。否则,请确保正确配置它以避免意外错误。正如我上面所解释的,对于Django,这一步非常容易做到。

你可能感兴趣的:(python进阶技能,django,python,后端)