- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我看了很多 SO 答案,似乎找不到这个问题。我觉得我只是错过了一些明显的东西。
我有一个基本的 Flask api,我已经实现了 flask_cors 扩展和自定义 Flask 装饰器 [@crossdomain from Armin Ronacher] . 1 ( http://flask.pocoo.org/snippets/56/ ) 两者都显示相同的问题。
这是我的示例应用:
application = Flask(__name__,
static_url_path='',
static_folder='static')
CORS(application)
application.config['CORS_HEADERS'] = 'Content-Type'
@application.route('/api/v1.0/example')
@cross_origin(origins=['http://example.com'])
# @crossdomain(origin='http://example.com')
def api_example():
print(request.headers)
response = jsonify({'key': 'value'})
print(response.headers)
return response
(插入编辑 3):
当我在浏览器中从 JS 向该端点发出 GET 请求时(从 127.0.0.1),它总是返回 200,而我希望看到:
Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:5000' is therefore not allowed access. The response had HTTP status code 403.
curl :
ACCT:ENVIRON user$ curl -i http://127.0.0.1:5000/api/v1.0/example
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 20
Access-Control-Allow-Origin: http://example.com
Server: Werkzeug/0.11.4 Python/2.7.11
Date: [datetime]
{
"key": "value"
}
日志:
Content-Length:
User-Agent: curl/7.54.0
Host: 127.0.0.1:5000
Accept: */*
Content-Type:
Content-Type: application/json
Content-Length: 20
127.0.0.1 - - [datetime] "GET /api/v1.0/example HTTP/1.1" 200 -
我什至没有在响应中看到所有正确的 header ,而且它似乎并不关心请求中的来源是什么。
知道我遗漏了什么吗?谢谢!
编辑:
作为旁注,查看文档示例 here ( https://flask-cors.readthedocs.io/en/v1.7.4/#a-more-complicated-example ),它显示:
@app.route("/")
def helloWorld():
'''
Since the path '/' does not match the regular expression r'/api/*',
this route does not have CORS headers set.
'''
return '''This view is not exposed over CORS.'''
...这很有趣,因为我已经在没有任何 CORS 装饰的情况下公开了根路径(和其他路径),并且它们从任何来源都可以正常工作。因此,此设置似乎存在根本性错误。
按照这些思路,教程 here ( https://blog.miguelgrinberg.com/post/designing-a-restful-api-with-python-and-flask ) 似乎表明 Flask api 自然应该在没有保护的情况下公开(我认为那只是因为尚未应用 CORS 扩展),但我的应用程序基本上就像 CORS 扩展根本不存在一样运行(除了您可以看到的日志中的一些注释)。
编辑 2:
我的评论不清楚,所以我在 AWS API Gateway 上创建了三个具有不同 CORS 设置的示例端点。它们是仅返回“成功”的 GET 方法端点:
1) CORS 未启用(默认):
响应:
XMLHttpRequest cannot load https://t9is0yupn4.execute-api.us-east-1.amazonaws.com/prod/cors-default. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:5000' is therefore not allowed access. The response had HTTP status code 403.
2) 启用 CORS - 来源受限:
Access-Control-Allow-Headers: 'Content-Type'
访问控制允许来源:' http://example.com '
响应:
XMLHttpRequest cannot load https://t9is0yupn4.execute-api.us-east-1.amazonaws.com/prod/cors-enabled-example. Response to preflight request doesn't pass access control check: The 'Access-Control-Allow-Origin' header has a value 'http://example.com' that is not equal to the supplied origin. Origin 'http://127.0.0.1:5000' is therefore not allowed access.
3) 启用 CORS - 原始通配符:
响应:
"success"
我在基础架构方面经验不足,但我的预期是启用 Flask CORS 扩展会导致我的 api 端点模仿此行为,具体取决于我在 origins=
设置中的设置。我在这个 Flask 设置中缺少什么?
解决方案编辑:
好吧,鉴于我这边的某些事情显然不正常,我剥离了我的应用程序并为 CORS 来源限制的每个变体重新实现了一些非常基本的 API。我一直在使用 AWS 的 elastic beanstalk 来托管测试环境,所以我重新上传了这些示例并向每个示例运行了 JS ajax 请求。它现在正在工作。
我在裸端点上收到 Access-Control-Allow-Origin
错误。看来,当我为部署配置应用程序时,我取消了 CORS(application, resources=r'/api/*')
的注释,这显然允许裸端点的所有来源!
我不确定为什么我的带有特定限制 (origins=[]
) 的路由也允许所有内容,但这一定是某种类型的拼写错误或一些小问题,因为它现在正在运行.
特别感谢sideshowbarker所有的帮助!
最佳答案
按原样从您的问题来看,您并不完全清楚您期望的行为是什么。但就 CORS 协议(protocol)的工作方式而言,您的服务器似乎已经按预期运行。
具体来说,问题中引用的 curl
响应显示了这个响应 header :
Access-Control-Allow-Origin: http://example.com
这表明服务器已经配置为告诉浏览器,如果代码在源 http://example.com
上运行,则只允许来自浏览器中运行的前端 JavaScript 代码的跨域请求。
如果您期望的行为是服务器现在将拒绝来自非浏览器客户端的请求,例如 curl
,那么 CORS 配置本身不会导致服务器执行那个。
当您配置 CORS 支持时,服务器唯一不同的地方就是发送 Access-Control-Allow-Origin
响应 header 和其他 CORS 响应 header 。就是这样。
CORS 限制的实际执行仅由浏览器完成,而不是由服务器完成。
因此,无论您进行何种服务器端 CORS 配置,服务器仍会继续接受来自所有客户端和来源的请求;换句话说,来自所有来源的所有客户端仍然继续从服务器获得响应,就像它们在其他情况下一样。
但是浏览器只会将来自跨源请求的响应暴露给在特定源上运行的前端 JavsScript 代码,前提是服务器将请求发送到通过响应 Access-Control-Allow-Origin
允许该来源的 header 。
这是您使用 CORS 配置唯一可以做的事情。您不能仅通过执行任何服务器端 CORS 配置来使服务器只接受和响应来自特定来源的请求。为此,您需要使用 CORS 配置以外的其他东西。
关于Python Flask CORS - API 始终允许任何来源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45538054/
我正在用 robocopy 编写一个 powershell 脚本来从列表中复制“完整的”unc/文件名路径。我遇到的问题是 robocopy 似乎在我的源路径末尾添加了一个 \。 我有一个 C:\te
我发现守护程序通过这些代码创建了一个容器 // NewBaseContainer creates a new container with its // basic configuration. fu
是否有所有潜在 map 源的列表?在示例页面上,可以浏览四种类型的 map 。外面还有什么? http://tombatossals.github.io/angular-leaflet-directi
是否有所有潜在 map 源的列表?在示例页面上,可以浏览四种类型的 map 。外面还有什么? http://tombatossals.github.io/angular-leaflet-directi
我们的网站比较多,第一次使用ElasticSearch不知道应该怎么配置ES: 我们想使用 ES 作为这些网站的唯一搜索引擎,我们是否应该为每个网站设置单独的 ES 实例? (我想这可能比一个 ES
我需要一些关于我对 UNI 项目的想法的建议。 我想知道是否可以将一个音频文件从不同的音频源分成不同的“流”。例如,将音频文件拆分为:引擎噪音、火车噪音、人声、并非始终存在的不同声音等。 我不一定需要
我想设置“公共(public)彩票”,每个人都可以看到选择是随机和公平的。如果我只需要一点,我会使用例如当天收盘道琼斯指数的 LSB。问题是,我需要 32 位。我需要一个来源: 每日可用 全世界都可以
来自 pickle 的 python 文档: Warning The pickle module is not secure. Only unpickle data you trust. 什么是 pi
我试图安排一个 liquidsoap 流媒体源在未来的特定日期和时间播放。我相信这可以使用 Liquidsoap switch 命令来完成,但我无法理解此处描述的文档:http://liquidsoa
对于Shiny应用程序,我希望能够播放在 session 本身期间生成的音频文件。 如果它是我要上传的音频文件,我将使用 tags$audio(src = "www/name.wav", ty
我想更改我的 OpenGL 来源。图片会说明: 现在是这样的: 这就是我想要的: 当前代码 gl.glViewport(0, 0, width, height); gl.glMatrixMode(GL
我正在尝试让 Stripe 运行起来,我几乎已经完成了,但有一件令人困惑的事情。 source: 'tok_visa' 部分。看起来它可以是“tok_mastercard”、“bank_account
我已经下载了 primefaces 源代码,看看是否可以从中学习。该 jar 包含一堆使用编写器来处理渲染等的 java 类。我期待找到一些 .xhtml 文件 ... and etc etc
如果我查看页面源代码,我会看到 styling += 'ul#topnav a.tabHeader5'; styling += '{'
我正在尝试根据显示器的大小更改背景图像。它不在服务器上运行。您可以在 https://github.com/Umpalompa/Umpalompa.github.io 找到我的所有代码. 我尝试同时使
从here的最底部开始.有一个 URL 生成器,我可以使用引荐来源网址在 Google Play 上生成指向我的应用程序的链接。我如何从谷歌分析中提取该 Activity 来源?我一直在谷歌上搜索,但
我用 Google Weather API 制作了一个插件,目前我正在从 Google 的 API 中提取图像。对于晴天,我正在拉 http://www.google.com//ig/images/w
是否可以通过环境变量为 @CrossOrigin 注释指定来源?我想这样做,以便我可以将相同的代码库用于 uat/staging/production。我希望我的 uat/staging 环境可以通过
我需要等待我的 JavaScript 中的文档准备就绪,才能在正文底部插入一个 div。 我想: 使此 JavaScript 文件尽可能小(如果可能,将其编译到 < 1kb) 在闭包中内联提供文档就绪
我正在开发电子邮件服务并想连接到谷歌帐户,是否可以将我的本地主机用作授权的 JavaScript 来源? 最佳答案 第 1 步:启用 Google+ API http://localhost:4567
我是一名优秀的程序员,十分优秀!