首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从导入的模块运行水瓶

从导入的模块运行水瓶
EN

Stack Overflow用户
提问于 2019-06-04 10:43:02
回答 1查看 749关注 0票数 0

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

基本上我有:

app.py:

代码语言:javascript
复制
import mywrapper

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

mywrapper.py

代码语言:javascript
复制
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.

有什么办法让酒瓶像这样运行吗?还是根本不可能?这样做的目的是为了在这种情况下抽离瓶。

在我的头脑中,烧瓶应该尝试导入mywrapper.py,它导入app.py,它应该生成应用程序和路由,但这似乎不是发生的事情。

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2019-06-04 11:14:22

因此,我了解到,Flask只在所选模块的命名空间中搜索包含Flask对象的变量。

也许有一种聪明的方法来避免这种限制,但我却认为更明智的做法是只包装Flask类本身。如果人们想要直接的烧瓶功能,在这种情况下我并不在乎,所以我唯一真正的限制是一些函数名是禁止使用的。

基本上:

wrapper.py:

代码语言:javascript
复制
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:

代码语言:javascript
复制
from mywrapper import Wrapper

app = Wrapper(__name__)

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

这仍然是抽象的,我对结果很满意。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56442282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档