django-cors-headers
django-cors-headers介绍
一个Django应用程序,向响应头中添加跨域资源共享(CORS)头。这允许从其他来源向Django应用程序发出浏览器内请求,当然也可以自定义中间件然后添加响应头信息。
关于cors问题可点击此处
安装
pip install django-cors-headers
注册到settings.py中的应用中
INSTALLED_APPS = [
...
'corsheaders' ,
...
]
添加一个中间件类来监听响应
MIDDLEWARE = [ # 或Django <1.10上的MIDDLEWARE_CLASSES
...
'corsheaders.middleware.CorsMiddleware' ,
'django.middleware.common.CommonMiddleware' ,
...
]
应将Corsmidlware放置在尽可能高的位置,尤其是要放在能够生成响应的中间件之前,比如Django的CommonMiddleware或Whitenoise middleware。如果不是放在这些响应中间件之前,它可能无法将CORS头添加到这些响应中。
另外,如果您使用CORS_REPLACE_HTTPS_REFERER,它应该放在Django的CsrfViewMiddleware之前。
配置
在Django设置中配置中间件的行为。您必须将允许进行跨站点请求的主机添加到 CORS_ORIGIN_WHITELIST,或将CORS_ORIGIN_ALLOW_ALL设置为True 以允许所有主机。
CORS_ORIGIN_ALLOW_ALL
如果为True,将不使用白名单,并且将接受所有来源。默认为False。
CORS_ORIGIN_WHITELIST
授权进行跨站点HTTP请求的来源列表。默认为[]。
CORS_ORIGIN_WHITELIST = [
'https://example.com' ,
'https://sub.example.com' ,
'http:// localhost:8080' ,
'http://127.0.0.1:9000'
]
CORS_ORIGIN_REGEX_WHITELIST
代表正则表达式的字符串列表,这些正则表达式与被授权发出跨站点HTTP请求的Origins相匹配。默认为[]。当 CORS_ORIGIN_WHITELIST不切实际时(例如您拥有大量子域时)很有用。
CORS_ORIGIN_REGEX_WHITELIST = [
r “ ^ https:// \ w + \ .example \ .com $” ,
]
以下参数是可选的。
CORS_URLS_REGEX
一个正则表达式,用于限制将发送CORS标头的URL。默认为r'^。* $',即匹配所有URL。当您仅在网站的一部分上需要CORS时很有用,例如/ api /处的API
CORS_URLS_REGEX = r '^ / api /.*$'
CORS_ALLOW_METHODS
实际请求所允许的请求方式列表。默认为:
CORS_ALLOW_METHODS = [
'DELETE' ,
'GET' ,
'OPTIONS' ,
'PATCH' ,
'POST' ,
'PUT' ,
]
可以将默认值导入为corsheaders.defaults.default_methods,因此您可以使用自定义方法对其进行扩展。这使您可以随时了解最新更改。例如:
from corsheaders.defaults import default_methods
CORS_ALLOW_METHODS = list(default_methods) + [
'POKE',
]
CORS_ALLOW_HEADERS
发出实际请求时可以使用的非标准HTTP标头的列表。默认为:
CORS_ALLOW_HEADERS = [
'accept',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
]
可以将默认值导入为corsheaders.defaults.default_headers,以便您可以使用自定义标头对其进行扩展。这使您可以随时了解最新更改。例如:
from corsheaders.defaults import default_headers
CORS_ALLOW_HEADERS = list(default_headers) + [
'my-custom-header',
]
CORS_EXPOSE_HEADERS
The list of HTTP headers that are to be exposed to the browser. Defaults to [].
CORS_PREFLIGHT_MAX_AGE
客户端/浏览器可以缓存预检响应的秒数。 如果该值为0(或任何错误值),则不会发送最大期限标头。 默认为86400(一天)。
注意:预检请求是在发出“复杂请求”(例如Content-Type不是application / x-www-form-urlencoded)时提出的额外请求,用于确定服务器实际接受的请求。
CORS_ALLOW_CREDENTIALS
如果为True,则将允许将cookie包含在跨站点HTTP请求中。默认为False。
注意:在Django 2.1中,添加了SESSION_COOKIE_SAMESITE设置,默认情况下设置为 Lax,这将防止Django的会话Cookie跨域发送。将其更改为‘ None ’可绕过此安全限制。
CSRF集成
大多数站点将需要利用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',
]
CORS_REPLACE_HTTPS_REFERER
CSRF_TRUSTED_ORIGINS是Django 1.9中引入的,因此早期版本的用户将需要替代解决方案。如果CORS_REPLACE_HTTPS_REFERER为 True,则只要CORS检查通过,CorsMiddleware就会将Referer标头更改为将通过Django的CSRF检查的内容。默认为 False。
请注意,与CSRF_TRUSTED_ORIGINS不同,此设置不允许您区分CORS 信任读取资源的域和避免CSRF保护而信任更改资源的域。
启用此功能后,您还应该在MIDDLEWARE_CLASSES中的django.middleware.csrf.CsrfViewMiddleware之后添加corsheaders.middleware.CorsPostCsrfMiddleware来撤消Referer
MIDDLEWARE_CLASSES = [
...
'corsheaders.middleware.CorsMiddleware' ,
...
'django.middleware.csrf.CsrfViewMiddleware' ,
'corsheaders.middleware.CorsPostCsrfMiddleware' ,
...
]
Signals
如果您的用例需要的不仅仅是上述配置,那么您可以附加代码来检查是否应该允许给定的请求。例如,这可用于读取模型允许的来源列表。将任意数量的处理程序附加到启用check_request_enabled的Django信号上,该信号提供request参数(在处理程序中使用** kwargs防止将来添加任何参数)。如果附加到信号的任何处理程序返回truthy值,则将允许该请求。
例如,您可以定义如下处理程序:
# myapp/handlers.py
from corsheaders.signals import check_request_enabled
from myapp.models import MySite
def cors_allow_mysites(sender, request, **kwargs):
return MySite.objects.filter(host=request.host).exists()
check_request_enabled.connect(cors_allow_mysites)
然后在应用就绪时使用Django AppConfig连接它:
# myapp/__init__.py
default_app_config = 'myapp.apps.MyAppConfig'
# myapp/apps.py
from django.apps import AppConfig
class MyAppConfig(AppConfig):
name = 'myapp'
def ready(self):
# Makes sure all signal handlers are connected
from myapp import handlers # noqa
信号的常见用例是允许所有来源访问URL的子集,同时允许一组正常的来源访问所有 URL。仅使用常规配置是不可能的,但是可以使用信号处理程序来实现。
首先将CORS_ORIGIN_WHITELIST设置为允许访问每个URL的受信任来源列表,然后将处理程序添加到 check_request_enabled以允许CORS不受限制URL的来源。例如:
# myapp/handlers.py
from corsheaders.signals import check_request_enabled
def cors_allow_api_to_everyone(sender, request, **kwargs):
return request.path.startswith('/api/')
check_request_enabled.connect(cors_allow_api_to_everyone)
django-cors-headers的更多相关文章
- Django cors跨域问题
Django cors跨域问题 前后端分离项目中的跨域问题 即同源策略 同源策略:同源策略/SOP(Same origin policy)是一种约定,由 Netscape 公司 1995 年引入浏览器 ...
- Django CORS跨域资源共享
1,什么是CORS 允许浏览器向跨源(协议 + 域名 + 端口)服务器发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制 2,特点 1,浏览器自动完成(在请求头中加入特 ...
- Django序列化&django REST framework
第一章.Django序列化操作 1.django的view实现商品列表页(基于View类) # 通过json来序列化,但手写字典key代码量较大,容易出错:还有遇到时间,图片序列化会报错 from g ...
- Django REST framework+Vue 打造生鲜超市(五)
六.商品类别数据展示 6.1. 商品类别数据接口 (1)商品分类有两个接口: 一种是全部分类:一级二级三级 一种是某一类的分类以及商品详细信息: 开始写商品分类的接口 (2)序列化 给分类添加三级分类 ...
- python 全栈开发,Day100(restful 接口,DRF组件,DRF跨域(cors组件))
昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确.方便快速开发 - 针对pc,手机,ipad,微信,支付宝... 使用同一个接口 2. 简述http协议? - 基 ...
- DJango跨域中间键
Skip to main content Search PyPISearch Help Donate Log in Register django-cors-middleware 1.3.1 pi ...
- 记一次 CORS 跨域请求出现 OPTIONS 请求的问题及解决方法
今天前后端在联调接口的时候,发生了跨域请求资源获取不到的问题. 首先说明下跨域问题的由来.引自HTTP 访问控制 的一段话: 当 Web 资源请求由其它域名或端口提供的资源时,会发起跨域 HTTP 请 ...
- Django REST framework+Vue 打造生鲜电商项目(笔记三)
(PS:转载自http://www.cnblogs.com/derek1184405959/p/8810591.html 有修改) 一.drf的过滤 (1)添加到app里面 INSTALLED_AP ...
- 利用CORS实现跨域请求(转载)
跨域请求一直是网页编程中的一个难题,在过去,绝大多数人都倾向于使用JSONP来解决这一问题.不过现在,我们可以考虑一下W3C中一项新的特性--CORS(Cross-Origin Resource Sh ...
- CORS 跨域
跨域请求一直是网页编程中的一个难题,在过去,绝大多数人都倾向于使用JSONP来解决这一问题.不过现在,我们可以考虑一下W3C中一项新的特性——CORS(Cross-Origin Resource Sh ...
随机推荐
- Mysql备份参数
--all-databases , -A 导出全部数据库. mysqldump -uroot -p --all-databases --all-tablespaces , -Y 导出全部表空间. my ...
- Selenium(Webdriver)自动化测试常问问题
http://blog.sina.com.cn/s/blog_c189e2590102w3bv.html Selenium(Webdriver)自动化测试常问问题 (1)selenium中如何保证操作 ...
- Django | 解决“(1146, "Table 'mydb.django_session' doesn't exist")”报错的方法
我只写了下面一行 就生成了session表 manage.py makemigrations sessions manage.py migrate sessions 参考:https://www.cn ...
- layer iframe 设置关闭按钮 和刷新和弹出框设置
layer弹出层的关闭问题 就是在执行添加或修改的时候,需要将数据提交到后台进行处理,这时候添加成功之后最理想的状态是关闭弹出层并且刷新列表的数据信息,之前一直想实现这样,可一直没有成功,今天决定 ...
- 10个Spring Boot快速开发的项目,接私活利器(快速、高效)
本文为大家精选了 码云 上优秀的 Spring Boot 语言开源项目,涵盖了企业级系统框架.文件文档系统.秒杀系统.微服务化系统.后台管理系统等,希望能够给大家带来一点帮助:) 1.项目名称:分布式 ...
- Oracle的物理结构的三种文件
.dbf数据文件,是用于存储数据库数据的文件,例如表中的记录,索引,数据字典信息等,可以通过系统数据字典DBA_DATA_FILES查看相关信息.与逻辑角度的表空间(并不是真正的文件)对应,一个表空间 ...
- grunt里面将es6转为es5,遇到的坑
今天看了一下grunt的官方文档,就按照教程来自己创建一个demo,发现grunt要把es6转化为es5需要安装babel,然后就按照grunt-babel的文档进行了一系列操作,等我要兴致勃勃的运行 ...
- Leetcode找三个数字的和满足xx条件的题目总结15➕16➕259
双指针最基础的题目是一个区间里找两个数字的和等于Target.首先将区间从小到大排序.接下来只要一个le指针,一个ri指针,分别从区间左右边界往中间推进即可.复杂度是排序的nlogn. 下面几道题都是 ...
- Intellij IDEA 控制台中文乱码问题
如果Intellij IDEA 控制台出现中文乱码: 1.修改Intellij IDEA 配置文件: 在安装目录的bin文件夹里找到 idea.exe.vmoptions 和 idea64.exe.v ...
- [C++] JsonCPP 的使用 完整配置过程
最近准备开发一个程序 需要用到C++ 解析json 原始的C++解析json是不现实的 自己也写不出来json解析方法(主要是不靠谱) 所以找到了jsoncpp 这个库 但是... 因为各种原因 配置 ...