将Flask请求注入另一个Flask应用

有没有一种方法可以将Flask请求对象注入到其他Flask应用中。这就是我想要做的:

app = flask.Flask(__name__)

@app.route('/foo/<id>')

def do_something(id):

return _process_request(id)

def say_hello(request):

# request is an instance of flask.Request.

# I want to inject it into 'app'

我正在尝试使用Google Cloud Functions,say_hello()这是由云运行时调用的函数。它接收一个flask.Request作为参数,然后我要通过自己的一组路由进行处理。

我尝试了以下操作,但不起作用:

def say_hello(request):

with app.request_context(request.environ):

return app.full_dispatch_request()

对于所有请求,这将返回404错误。

编辑:

实现的简单方法say_hello()如下:

def say_hello(request):

if request.method == 'GET' and request.path.startswith('/foo/'):

return do_something(_get_id(request.path))

flask.abort(404)

这本质上要求我自己编写路由匹配逻辑。我想知道是否有一种避免这样做的方法,而是使用Flask的内置装饰器和路由功能。

编辑2:

有趣的是,跨应用程序分发在本地工作:

app = flask.Flask(__name__)

# Add app.routes here

functions = flask.Flask('functions')

@functions.route('/', defaults={'path': ''})

@functions.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE'])

def catch_all(path):

with app.request_context(flask.request.environ):

return app.full_dispatch_request()

if __name__ == '__main__':

functions.run()

但是,相同的技术似乎不适用于GCF。

回答:

我不推荐这种方法,但是从技术上讲,可以通过滥用请求堆栈并重写当前请求并重新调度它来实现。

但是,你仍然需要执行某种类型的自定义“路由”以正确设置url_rule,因为GCF的传入请求将没有该请求(除非你通过请求明确提供了该请求):

from flask import Flask, _request_ctx_stack

from werkzeug.routing import Rule

app = Flask(__name__)

@app.route('/hi')

def hi(*args, **kwargs):

return 'Hi!'

def say_hello(request):

ctx = _request_ctx_stack.top

request = ctx.request

request.url_rule = Rule('/hi', endpoint='hi')

ctx.request = request

_request_ctx_stack.push(ctx)

return app.dispatch_request()

以上是 将Flask请求注入另一个Flask应用 的全部内容, 来源链接: utcz.com/qa/407714.html

回到顶部