Eva*_*van 61
我花了很多时间研究同样的事情,最终找到了一个使用请求库的解决方案,似乎运行良好.它甚至可以在一个响应中设置多个cookie,这需要进行一些调查才能弄明白.这是烧瓶视图功能:
from flask import request, Response
import requests
def _proxy(*args, **kwargs):
resp = requests.request(
method=request.method,
url=request.url.replace(request.host_url, 'new-domain.com'),
headers={key: value for (key, value) in request.headers if key != 'Host'},
data=request.get_data(),
cookies=request.cookies,
allow_redirects=False)
excluded_headers = ['content-encoding', 'content-length', 'transfer-encoding', 'connection']
headers = [(name, value) for (name, value) in resp.raw.headers.items()
if name.lower() not in excluded_headers]
response = Response(resp.content, resp.status_code, headers)
return response
Run Code Online (Sandbox Code Playgroud)
我在基于Werkzeug的应用程序中使用httplib实现了代理(在您的情况下,我需要使用webapp的身份验证和授权).
虽然Flask文档没有说明如何访问HTTP标头,但您可以使用request.headers(参见Werkzeug文档).如果您不需要修改响应,并且代理应用程序使用的标头是可预测的,则代理是明确的.
请注意,如果您不需要修改响应,则应使用werkzeug.wsgi.wrap_file包装httplib的响应流.这允许将开放的OS级文件描述符传递给HTTP服务器以获得最佳性能.
我最初的计划是面向公众的URL就像http://www.example.com/admin/myapp代理一样http://myapp.internal.example.com/.沿着这条路走下去会导致疯狂.
大多数webapps,特别是自托管的webapps,都假设它们将在HTTP服务器的根目录下运行,并通过绝对路径引用其他文件.要解决此问题,您必须在整个地方重写URL:位置标头和HTML,JavaScript和CSS文件.
我确实写了一个Flask代理蓝图,它做了这个,虽然它对我真正想要代理的一个webapp工作得很好,但它不可持续.这是正则表达式的一大堆.
最后,我在nginx中设置了一个新的虚拟主机,并使用了自己的代理.由于两者都是主机的根,因此大多数情况下不需要重写URL.(还有什么是必要的,nginx的代理模块处理完毕.)被代理的webapp执行自己的身份验证,现在已经足够了.
| 归档时间: |
|
| 查看次数: |
24475 次 |
| 最近记录: |