首页 > 解决方案 > web.py app.request() 的 Flask/Werkzeug 等价性

问题描述

我正在将应用程序从 web.py 移植到 Flask,主要是因为 web.py 对 Python 3 的支持参差不齐,而且似乎对 web.py 的兴趣越来越少。

但是我在 Flask/Werkzeug 中找不到的是一种使用路由器在我的应用程序中调度内部请求的方法。该应用程序的结构使得会有很多应用程序内调用,在 web.py 中我或多或少地处理这些调用如下:

app = web.application(....)

def callUrl(url, method, env, data):
    parserUrl = url lib.parse.urlparse(url)
    if parsedUrl.scheme == '' and parsedUrl.netloc == '':
        # local call
        res = app.request(url, method=method, data=data, env=env)
        ...
    else:
        assert env == {}
        res = requests.request(url, method=method, data=data)
        ....

我正试图找到一种方法来用 Flask 做类似的事情,但显然我找错了地方。有人可以指出我正确的方向吗?

标签: pythonflaskwerkzeug

解决方案


好的,回答我自己的问题。我选择的解决方案基本上是从 web.py 重新实现,方法app.request是用所有必需的 WSGI 变量(、、等)填充环境字典REQUEST_METHODPATH_INFO包括将正确数据提供给 WSGI 应用程序wsgi.input的对象。io.BytesIO()

然后我创建了一个合适的 start_response() 方法来保存标题,并调用

resultData = app.wsgi_app(environ, start_response)

烧瓶应用程序经历了推送请求和环境的所有动作并执行所有路由,然后我将返回的数据取回resultData(并且带有任何错误的标头等已传递给我的start_response方法)。


推荐阅读