【问题标题】:Interaction with Flask's app from within Flask-Script在 Flask-Script 中与 Flask 的应用程序交互
【发布时间】:2014-04-14 15:47:57
【问题描述】:

我正在运行一个烧瓶应用程序,我想要一些可以与之交互的东西。让我用下一个例子来解释:

Flask 应用:

from flask import Flask

MyApp = Flask(__name__)

mytext = "Hello World!"

@app.route('/')
def hello_world():
    return mytext

def text_reload():
    global mytext
    mytext = "Hey! I have been reloaded!"

if __name__ == '__main__':
    MyApp.run()

Flask-Script (manager.py):

from flask.ext.script import Manager
from myapp import MyApp

manager = Manager(MyApp)

@manager.command
def reload_mytext():
    **DO SOME MAGIC HERE**

if __name__ == '__main__':
    manager.run()

reload_mytext() 从应用内调用 text_reload() 函数。

我应该在烧瓶脚本中添加什么魔法来完成这些事情?这样的事情有可能吗?

【问题讨论】:

  • 每次使用命令行时,Flask-Script 都会在一个新进程中运行;这个过程总是与正在运行的服务器分开的。这意味着您需要某种形式的进程间通信或共享的外部数据库来实现您想要做的事情。这里的目标是什么,你最终要达到什么目标?
  • 我想创建一个烧瓶脚本场景,当它需要让烧瓶应用重新加载/重新定义一些变量时可以调用它。
  • 是的,我知道流程不同。我想知道是否有 API 或其他东西可以从外部触发烧瓶应用程序的方法。一条特殊的路线可以解决问题,但可能有内部问题。我不知道。
  • 没有为您预先编码的内容;一条特殊的路线将是解决此问题的最简单方法。
  • @MartijnPieters,谢谢。我将研究进程间通信——这才是我真正想要的:)

标签: flask flask-script


【解决方案1】:

我认为 app.app_context() 是您正在寻找的。 但是你需要先让上下文喜欢。

def _make_context():
    return dict(app=app, db=db, models=models)

manager = Manager(create_app)
manager.add_command("livereload", liveReloadServer, Shell(make_context=_make_context))

然后:

class liveReloadServer(Command):
    """prints hello world"""
    def run(self):
        with app.app_context():
            server = Server(app.wsgi_app)
            app.config['LIVERELOAD'] = True
            server.serve(port=8080)

【讨论】:

    猜你喜欢
    • 2021-03-21
    • 2016-02-04
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多