60

最初,我尝试将 ajax 请求从客户端发布到第三方 url,但似乎浏览器存在安全问题。我想过向服务器端发送一个ajax,从那里向第三方发送一个GET请求,获取响应并将其发送回客户端。我怎么能用烧瓶做到这一点?

4

3 回答 3

76

安装requests模块(比 using 好得多urllib2),然后定义一个发出必要请求的路由 - 例如:

import requests
from flask import Flask
app = Flask(__name__)

@app.route('/some-url')
def get_data():
    return requests.get('http://example.com').content

但是,根据您的设置,最好将您的网络服务器配置为反向代理到某个 URL 下的目标站点。

于 2013-03-17T16:24:15.710 回答
15

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,因此您的代理请求将实际上是匿名的,因此,根据目标站点,可能会失败或给您与请求不同的响应浏览器中的那个资源。

如果您与第三方 URL 有关系(也就是说,如果您控制它或能够与这样做的人合作)他们可以使用CORS在浏览器中授予跨域请求的访问权限(仅在现代浏览器)或JSON-P(一种早于 CORS 的旧解决方法)。

第三方提供商还可以让您在端点访问所需的数据,该端点旨在接受来自其他服务器的请求,并为您提供验证应用程序的机制。最流行的协议是OAuth

于 2013-03-17T16:30:56.607 回答
2

正如其他答案所述,使用 Python 的 requests 模块将是从编码角度解决此问题的最佳方法。但是,正如提到的评论(以及我提出这个问题的原因),这可能会导致请求被拒绝的错误。这个错误很可能是由 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

于 2018-02-11T04:49:28.630 回答