Запуск Flask из импортированного модуля - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь запустить Flask из импортированного модуля (создание оболочки с использованием декораторов).

В основном у меня есть:

app.py:

import mywrapper

@mywrapper.entrypoint
def test():
    print("HEYO!")

mywrapper.py

from flask import Flask

ENTRYPOINT = None

app = Flask(__name__)

@app.route("/")
def listen():
    """Start the model API service"""
    ENTRYPOINT()


def entrypoint(f):
    global ENTRYPOINT
    ENTRYPOINT = f
    return f

FLASK_APP=app

Запуск python -m flask, однако, приводит к:

flask.cli.NoAppException: Failed to find Flask application or factory in module "app". Use "FLASK_APP=app:name to specify one.


Есть ли какой-нибудь трюк, чтобы заставить Flask работать так? Или это просто невозможно? Целью этого является абстрагирование Flask в этой ситуации.

В моей голове фляга должна попытаться импортировать mywrapper.py, который импортирует app.py, который должен сгенерировать приложение и маршрут, но, похоже, это не то, что происходит.

Буду признателен за любую помощь.

1 Ответ

1 голос
/ 04 июня 2019

Итак, с тех пор я узнал, что Flask ищет только в пространстве имен выбранного модуля переменную, содержащую объект Flask.

Может быть разумный способ обойти это ограничение, но я решил, что этоболее разумно вместо этого просто обернуть сам класс Flask.Если людям нужна прямая функциональность Flask, мне все равно в этой ситуации, поэтому единственное реальное ограничение, которое у меня есть, это то, что некоторые имена функций запрещены.

В основном:

wrapper.py:

class Wrapper(Flask):
    def __init__(self, name):
        super().__init__(name)
        self.entrypoint_func = None

        @self.route("/")
        def listen():
            return self.entrypoint_func()

    def entrypoint(self, f):
        assert self.entrypoint_func is None, "Entrypoint can only be set once"

        self.entrypoint_func = f
        return f

и app.py:

from mywrapper import Wrapper

app = Wrapper(__name__)

@app.entrypoint
def test():
    print("HEYO!")
    return "SUCCESS"

Это все еще достаточно абстрактно, и я доволен результатами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...