最初,我尝试将客户端的ajax请求发布到第三方网址,但似乎浏览器存在安全问题。我想到将ajax发送到服务器端,从那里向第三方发送GET请求,得到响应并将其发送回客户端。我怎么能用烧瓶做到这一点?
答案 0 :(得分:55)
安装requests
模块(比使用urllib2
好得多)然后定义一条提供必要请求的路由 - 例如:
import requests
from flask import Flask
app = Flask(__name__)
@app.route('/some-url')
def get_data():
return requests.get('http://example.com').content
根据您的设置,最好将您的网络服务器配置为在特定网址下反向代理到目标网站。
答案 1 :(得分:8)
单独使用Flask没有此功能,但编写请求处理程序是一件简单的事情,该处理程序使用HTTP客户端库向另一台服务器发出请求,然后返回该响应。
# third-party HTTP client library
import requests
# assume that "app" below is your flask app, and that
# "Response" is imported from flask.
@app.route("/proxy-example")
def proxy_example():
r = requests.get("http://example.com/other-endpoint")
return Response(
r.text
status=r.status_code,
content_type=r.headers['content-type'],
)
但是,这不会达到与客户端请求所期望的完全相同的结果。由于您的服务器无法“看到”客户端浏览器为目标站点存储的任何cookie,因此您的代理请求将实际上是匿名的,因此,根据目标站点,可能会失败或者给出与您请求的响应不同的响应浏览器中的那个资源。
如果您与第三方网址有关系(即,如果您控制它或能够与所有人合作),他们可以使用{{3}在浏览器中为跨域请求提供访问权限(仅在现代浏览器中支持)或CORS(早于CORS的旧解决方法)。
第三方提供商还可以让您在端点上访问您想要的数据,该端点旨在接受来自其他服务器的请求,并为您提供验证应用程序身份的机制。最受欢迎的协议是JSON-P。
答案 2 :(得分:0)
正如其他答案所说,使用python的请求模块将是从编码角度解决这个问题的最佳方法。但是,正如所提到的评论(以及我提出这个问题的原因),这可能会导致请求被拒绝的错误。 SELinux可能会导致此错误。
要检查是否存在此问题,请首先确保使用此命令启用SELinux:
sestatus
如果'当前模式'为'强制',则启用SELinux。
接下来使用以下命令获取直接应用于apache的当前bool值:
getsebool -a | grep httpd
查找“httpd_can_network_connect”设置,确定是否允许apache向网络发出TCP请求。如果它已启用,那么将允许所有apache TCP请求。要打开它,请以root身份运行以下命令:
setsebool -P httpd_can_network_connect 1
如果你只需要数据库访问(之前我遇到过这个问题,这就是我怀疑SELinux的原因),那么最好只打开'httpd_cna_network_connect'。
此政策的目的是,如果黑客劫持您的apache服务器,他们将无法通过服务器进入内部网络的其余部分。
作为评论,这可能会更好,但我没有足够的代表......
来源: https://tag1consulting.com/blog/stop-disabling-selinux https://wiki.centos.org/TipsAndTricks/SelinuxBooleans