Есть ли способ вставить объект запроса на флягу в другое приложение 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, где 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
"маршрутизацию", чтобы правильно установить 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()
requests
и фактически сделать запрос наview
другогоapp
вас есть.