【问题标题】:How do I remove globals from Flask API calls?如何从 Flask API 调用中删除全局变量?
【发布时间】:2016-06-28 11:29:58
【问题描述】:

我正在开发一个将运行Foo 的 Flask 应用程序。一旦Foo 运行,应该可以点击hostname:8080 的端点来执行一些改变Foo 状态的API 调用。

下面是一个相当小(虽然不完整)的例子。引用的方法和函数并不是非常重要,因为问题是关于状态受到影响的全局对象

__foo = None
app = Flask(__name__)

@app.route("/start_foo")
def start_foo():
    return __foo._do_foo_init() or ""

def run_foo(foo, debug=False):
    """
    Entry point for clients to run a foo
    :param foo:
    :return:
    """
    global __foo
    __foo = foo
    t = threading.Thread(target=delayed_registration, args=(foo,))
    t.start()
    app.run(host=hostname, debug=debug, port=8080)

当用户调用run_foo 时,她将提供一个Bar,它是Foo 的子类,但这不重要。

我在想使@app.route 成为一个类的方法并将foo 作为类的成员,但我不知道这在Flask 中是否可行。

有没有人有关于如何删除上述应用程序中的全局__foo 的建议?

【问题讨论】:

  • @code_onkel 我认为这适用于在应用程序上下文中创建的资源。由于run_foo 将接受以前创建的Foo,我不确定它是否会起作用。不过,我可能会误解它的用途!

标签: python python-3.x flask global-variables


【解决方案1】:

在烧瓶中,您应该将应用程序全局对象存储在 flask.g (see the documentation for more information) 中。确实,这是应用程序的“本地”,但在烧瓶中,应该可以在同一个 python 解释器中拥有多个应用程序。烧瓶documentation 状态:

由于 Flask 设计的支柱之一是您可以在同一个 Python 进程中拥有多个应用程序。

所以除了配置之外的一切都不应该是全局的,而是烧瓶应用程序的本地。

【讨论】:

  • 我会尝试一下。一旦我玩过它就会报告。在此期间投赞成票!
  • 我不太确定烧瓶代理如何与线程交互,因此那里可能存在问题。但我想这也取决于您在 delay_registration 中到底在做什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 1970-01-01
  • 2018-05-22
  • 1970-01-01
  • 2014-05-04
  • 1970-01-01
  • 2017-10-15
相关资源
最近更新 更多