首页 > 解决方案 > 从导入的模块运行 Flask

问题描述

我正在尝试从导入的模块运行 Flask(使用装饰器创建包装器)。

基本上我有:

应用程序.py:

import mywrapper

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

我的包装器.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应该生成应用程序和路由,但这似乎不是发生的事情。

任何帮助,将不胜感激。

标签: pythonflask

解决方案


所以我从那以后了解到 Flask 只在所选模块的命名空间中搜索包含 Flask 对象的变量。

可能有一种聪明的方法可以避免这种限制,但我决定将 Flask 类本身包装起来更明智。如果人们想要直接的 Flask 功能,我真的不在乎这种情况,所以我唯一真正的限制是某些函数名称是不受限制的。

基本上:

包装器.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"

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


推荐阅读