我正在尝试从导入的模块运行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}},这应该会生成应用程序和路由,但这似乎并非如此。
任何帮助将不胜感激。
答案 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"
这仍然足够抽象,我对结果感到满意。