Внедрение запроса Flask в другое приложение Flask

1

Есть ли способ вставить объект запроса на флягу в другое приложение 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.

  • 0
    Вы имеете в виду несколько экземпляров приложения? кроме этого, вы можете сойти с рук с requests и фактически сделать запрос на view другого app вас есть.
  • 0
    Не совсем уверен, что следую за тобой. Я добавил еще несколько деталей в пост, дополнительно объясняя, что я пытаюсь сделать.
Теги:
flask
google-cloud-functions

1 ответ

0

Я бы не рекомендовал этот метод, но это технически возможно, злоупотребляя стеком запросов и переписывая текущий запрос и повторно отправляя его.

Тем не менее, вам все равно нужно выполнить некоторую 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()
  • 0
    Спасибо Дастин. Я попробую. Я обнаружил, что перекрестная диспетчеризация приложений работает локально (см. «Правка 2», которую я добавил к вопросу). Было бы неплохо, если бы GCF тоже поддерживал нечто подобное.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню