为Python Flask应用程序创建代理

为Python Flask应用程序创建代理,python,nginx,proxy,flask,Python,Nginx,Proxy,Flask,我们有一个内部应用程序,后端用Java编写,前端用HTML、Javascript等编写。该应用程序使用托管。然而,我有另一个web应用程序是用PythonFlask编写的,boss希望将这两个工具集成在一起 例如,初始项目(Java解决方案)具有域 inv.datafireball.com 管理员向我展示了他可以通过这种方式更改nginx的配置文件,路由可以是运行在不同服务器上的第二个应用程序 inv.datafireball.com/competitor -> datafirebal

我们有一个内部应用程序,后端用Java编写,前端用HTML、Javascript等编写。该应用程序使用托管。然而,我有另一个web应用程序是用PythonFlask编写的,boss希望将这两个工具集成在一起

例如,初始项目(Java解决方案)具有域

inv.datafireball.com 
管理员向我展示了他可以通过这种方式更改nginx的配置文件,路由可以是运行在不同服务器上的第二个应用程序

inv.datafireball.com/competitor -> datafireball.com:5000
但是,根据我的研究,Python应用程序中的所有路径都需要重新编码:
/static/js/d3.js
需要更改为
/competitor/static/js/d3.js

我们硬编码了一些路径,这看起来非常有希望,但是,我们的Python应用程序非常大,在手动更改所有路径之后,这确实是一个很大的问题


如果有一种简单的方法可以通过更改现有的Python代码将Python flask应用程序映射/代理到用Java编写的现有应用程序,有谁能给我一个指导吗?

这里有一个解决方案需要对flask应用程序进行最小的更改,并且效果非常好:

下面是它的基本功能:我们告诉Nginx将一些特殊的头传递给代理flask应用程序,然后创建一个包装器(ReverseProxied),该包装器拦截每个请求,提取Nginx设置的头,并修改请求处理环境,使其与我们想要的URL匹配

在Nginx中,在server指令中添加以下内容:

location /competitor {
    proxy_pass http://127.0.0.1:5001;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Scheme $scheme;
    proxy_set_header X-Script-Name /competitor;
}
在Flask中,将下面的类添加到主应用程序文件中(无论您在何处创建主Flask应用程序对象)

最后,强制应用程序使用新的ReverseProxied中间件

app = Flask(__name__)
app.wsgi_app = ReverseProxied(app.wsgi_app)
您可以在这里找到原始解决方案和代码片段

app = Flask(__name__)
app.wsgi_app = ReverseProxied(app.wsgi_app)