我想将对Flask应用程序发出的请求代理到本机在本地运行的另一个Web服务。我宁愿使用Flask而不是我们的更高级别的nginx实例,这样我们就可以重用我们应用程序内置的现有身份验证系统。我们越能保持这种“单点登录”就越好。
是否有现有模块或其他代码才能执行此操作?尝试将Flask应用程序连接到像httplib或urllib这样的东西是一种痛苦。
答案 0 :(得分:47)
我花了很多时间研究同样的事情,最终找到了一个使用请求库的解决方案,似乎运行良好。它甚至可以在一个响应中设置多个cookie,这需要进行一些调查才能弄明白。这是烧瓶视图功能:
insert into xx_tab_abc (wr_flag,
actual_term_date,
person_num
)
SELECT 'Y',
ACTUAL_TERM_DATE,
PERSON_NUMBER
FROM WR_TAB
WHERE ACTUAL_TERM_DATE IS NOT NULL
答案 1 :(得分:8)
我在基于Werkzeug的应用程序中使用httplib实现了代理(在您的情况下,我需要使用webapp的身份验证和授权)。
虽然Flask文档没有说明如何访问HTTP标头,但您可以使用request.headers
(请参阅Werkzeug documentation)。如果您不需要修改响应,并且代理应用程序使用的标头是可预测的,则代理是明确的。
请注意,如果您不需要修改响应,则应使用werkzeug.wsgi.wrap_file
来包装httplib的响应流。这允许将开放的OS级文件描述符传递给HTTP服务器以获得最佳性能。
答案 2 :(得分:7)
我的原始计划是面向公众的网址类似http://www.example.com/admin/myapp
代理http://myapp.internal.example.com/
。沿着这条路走下去会导致疯狂。
大多数webapps,特别是自托管的webapps,都假设它们将在HTTP服务器的根目录下运行,并通过绝对路径引用其他文件。要解决此问题,您必须在整个地方重写URL:位置标头和HTML,JavaScript和CSS文件。
我做了write a Flask proxy blueprint这样做了,虽然它对我真正想要代理的一个webapp运行得足够好,但它不可持续。这是正则表达式的一大堆。
最后,我在nginx中设置了一个新的虚拟主机并使用了自己的代理。由于两者都是主机的根,因此大多数情况下不需要重写URL。 (还有什么是必要的,nginx的代理模块处理完毕。)被代理的webapp执行自己的身份验证,现在已经足够了。