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,这一步非常容易做到。

Django CORS指南相关推荐

  1. (译)一个完整的Django入门指南---第7部分

    1.前言 本篇文章是翻译 A Complete Beginner's Guide to Django 系列的最后一篇文章 A Complete Beginner's Guide to Django - ...

  2. 一个完整的Django入门指南 - 第1部分

    译者:vimiix 原文地址:https://simpleisbetterthancomplex.com/series/2017/09/04/a-complete-beginners-guide-to ...

  3. 完整的Django入门指南学习笔记7 网页自动翻译

    转自[https://simpleisbetterthancomplex.com/series/2017/10/16/a-complete-beginners-guide-to-django-part ...

  4. 【Django采用cors跨域收不到POST请求】

    Django cors跨域问题 问题:只能获取GET请求,无法接收POST 在一开始简单测试的时候,没有任何问题,因为只是接受到了GET请求,然后写注册页面时候惊奇的发现,POST直接接收不到,调试界 ...

  5. 全栈“食”代:用 Django + Nuxt 实现美食分享网站(上)

    Django 作为 Python 社区最受欢迎的 Web 框架之一,凭借其高度抽象的组件和强大方便的脚手架,将快速且流畅的开发体验演绎到了极致.而 Nuxt 作为从 Vue.js 进化而来的前端框架, ...

  6. 全栈“食”代:用 Django + Nuxt 实现美食分享网站(一)

    Django 作为 Python 社区最受欢迎的 Web 框架之一,凭借其高度抽象的组件和强大方便的脚手架,将快速且流畅的开发体验演绎到了极致.而 Nuxt 作为从 Vue.js 进化而来的前端框架, ...

  7. django创建博客

    http://twentyfour.blog.51cto.com/945260/711249 Django--->"最适合开发有限期的完美web框架" 1.创建项目  [ro ...

  8. Mozilla网站安全分析工具Observatory已发布

    Mozilla最近发布了一款名为Observatory的网站安全分析工具,意在鼓励开发者和系统管理员增强自己网站的安全配置. \\ 该工具的用法非常简单:输入网站URL,即可访问并分析网站HTTP标头 ...

  9. ApacheCN PythonWeb 译文集 20211110 更新

    Django By Example 中文版 1 创建一个博客应用 2 为博客添加高级功能 3 扩展你的博客应用 4 创建一个社交网站 5 分享内容到你的网站 6 跟踪用户动作 7 构建在线商店 8 管 ...

最新文章

  1. C语言fseek()函数(whence)重新定位文件指针位置
  2. LeetCode动态规划 跳跃游戏II
  3. VisualVM远程连接Linux服务器通过jstatd方式监控JVM内存状态
  4. (转)gcc 的简单使用说明
  5. MySQL存储过程(四)——存储过程循环流控语句
  6. EDM营销模式分析和讲解
  7. 181015扇贝有道词霸每日一句
  8. 汇编语言中xor指令_汇编语言基本指令
  9. 基于STM32制作万能遥控器---1
  10. 重新整理的三国9州,郡,地域数据
  11. imac2017拆机
  12. 基于Python个人博客系统设计与实现 开题报告
  13. Servlet 和Session的关系
  14. 2019我获得的些许成绩,能不能弥补这一年光阴的流逝?盘点2019我的得失
  15. 【小甲鱼C语言】课后笔记第一章第二节——变量
  16. Object 类型转化为 BigDecimal 类型
  17. JAVA获取当前时间(yyyy-MM-dd HH:mm:ss)
  18. vue监听浏览器刷新和关闭事件,并在页面关闭/刷新前发送请求
  19. 【方案开发】医用级人体体温计额温仪方案
  20. 举例说明语言接触会造成哪些结果_2008年10月语言学概论自考试题及答案

热门文章

  1. 7 、【股票的交易规则】
  2. hdoj 积木堆砌的城堡 1268 (数学几何)
  3. 基于互联网技术的跌倒检测解决方案
  4. ELK部署+filebeat应用
  5. 微信自动跳转到浏览器
  6. linux不支持modprobe命令,Linux中的Modprobe命令
  7. CnOpenData中国各省份工商注册企业分年份企业性质企业数量统计(含新增,注销企业数量)
  8. GFF3提取fasta序列
  9. acm c语言大数问题,acm大数问题 | C/C++程序员之家
  10. noi题库(noi.openjudge.cn) 1.7编程基础之字符串T31——T35