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,接来下做以下步骤:
- 安装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,这一步非常容易做到。
Django CORS指南相关推荐
- (译)一个完整的Django入门指南---第7部分
1.前言 本篇文章是翻译 A Complete Beginner's Guide to Django 系列的最后一篇文章 A Complete Beginner's Guide to Django - ...
- 一个完整的Django入门指南 - 第1部分
译者:vimiix 原文地址:https://simpleisbetterthancomplex.com/series/2017/09/04/a-complete-beginners-guide-to ...
- 完整的Django入门指南学习笔记7 网页自动翻译
转自[https://simpleisbetterthancomplex.com/series/2017/10/16/a-complete-beginners-guide-to-django-part ...
- 【Django采用cors跨域收不到POST请求】
Django cors跨域问题 问题:只能获取GET请求,无法接收POST 在一开始简单测试的时候,没有任何问题,因为只是接受到了GET请求,然后写注册页面时候惊奇的发现,POST直接接收不到,调试界 ...
- 全栈“食”代:用 Django + Nuxt 实现美食分享网站(上)
Django 作为 Python 社区最受欢迎的 Web 框架之一,凭借其高度抽象的组件和强大方便的脚手架,将快速且流畅的开发体验演绎到了极致.而 Nuxt 作为从 Vue.js 进化而来的前端框架, ...
- 全栈“食”代:用 Django + Nuxt 实现美食分享网站(一)
Django 作为 Python 社区最受欢迎的 Web 框架之一,凭借其高度抽象的组件和强大方便的脚手架,将快速且流畅的开发体验演绎到了极致.而 Nuxt 作为从 Vue.js 进化而来的前端框架, ...
- django创建博客
http://twentyfour.blog.51cto.com/945260/711249 Django--->"最适合开发有限期的完美web框架" 1.创建项目 [ro ...
- Mozilla网站安全分析工具Observatory已发布
Mozilla最近发布了一款名为Observatory的网站安全分析工具,意在鼓励开发者和系统管理员增强自己网站的安全配置. \\ 该工具的用法非常简单:输入网站URL,即可访问并分析网站HTTP标头 ...
- ApacheCN PythonWeb 译文集 20211110 更新
Django By Example 中文版 1 创建一个博客应用 2 为博客添加高级功能 3 扩展你的博客应用 4 创建一个社交网站 5 分享内容到你的网站 6 跟踪用户动作 7 构建在线商店 8 管 ...
最新文章
- C语言fseek()函数(whence)重新定位文件指针位置
- LeetCode动态规划 跳跃游戏II
- VisualVM远程连接Linux服务器通过jstatd方式监控JVM内存状态
- (转)gcc 的简单使用说明
- MySQL存储过程(四)——存储过程循环流控语句
- EDM营销模式分析和讲解
- 181015扇贝有道词霸每日一句
- 汇编语言中xor指令_汇编语言基本指令
- 基于STM32制作万能遥控器---1
- 重新整理的三国9州,郡,地域数据
- imac2017拆机
- 基于Python个人博客系统设计与实现 开题报告
- Servlet 和Session的关系
- 2019我获得的些许成绩,能不能弥补这一年光阴的流逝?盘点2019我的得失
- 【小甲鱼C语言】课后笔记第一章第二节——变量
- Object 类型转化为 BigDecimal 类型
- JAVA获取当前时间(yyyy-MM-dd HH:mm:ss)
- vue监听浏览器刷新和关闭事件,并在页面关闭/刷新前发送请求
- 【方案开发】医用级人体体温计额温仪方案
- 举例说明语言接触会造成哪些结果_2008年10月语言学概论自考试题及答案
热门文章
- 7 、【股票的交易规则】
- hdoj 积木堆砌的城堡 1268 (数学几何)
- 基于互联网技术的跌倒检测解决方案
- ELK部署+filebeat应用
- 微信自动跳转到浏览器
- linux不支持modprobe命令,Linux中的Modprobe命令
- CnOpenData中国各省份工商注册企业分年份企业性质企业数量统计(含新增,注销企业数量)
- GFF3提取fasta序列
- acm c语言大数问题,acm大数问题 | C/C++程序员之家
- noi题库(noi.openjudge.cn) 1.7编程基础之字符串T31——T35