从导入的模块运行Flask

时间:2019-06-04 10:43:02

标签: python flask

我正在尝试从导入的模块运行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 个答案:

答案 0 :(得分:1)

所以从那以后,我了解到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"

这仍然足够抽象,我对结果感到满意。