将 flask-migrate 与 flask-script、flask-socketio 和应用程序工厂一起使用
using flask-migrate with flask-script, flask-socketio and application factory
我正在使用应用程序工厂方法创建一个 Flask 应用程序,但是在将 Flask-Migrate 与 socketio 和 flask-script 一起使用时遇到问题。
问题是我正在将 create_app
函数传递给 Manager
,但我还需要将 app
传递给 socketio.run()
。现在我似乎看不到解决方案。有什么办法可以结合这两种解决方案吗?
manage.py:
#app = create_app(False) <--- Old approach
#manager = flask_script.Manager(app)
manager = flask_script.Manager(create_app)
manager.add_option("-t", "--testing", dest="testing", required=False)
manager.add_command("run", socketio.run(
app,
host='127.0.0.1',
port=5000,
use_reloader=False)
)
# DB Management
manager.add_command("db", flask_migrate.MigrateCommand)
当我对 socketio 使用旧方法时,但没有 flask-migrate 一切正常。如果我使用新方法并删除 socketio 部分,则迁移有效。
注意:我希望能够使用以下两个命令调用我的应用程序。
python manage.py run
python manage.py -t True db upgrade
编辑:
尝试使用 current_app
我得到 RuntimeError: working outside of application context
manager.add_command("run", socketio.run(
flask.current_app,
host='127.0.0.1',
port=5000,
use_reloader=False)
)
根据 Miguel 的评论,我找到了一种可行的方法。
由于某些原因,以下代码不起作用
manager.add_command("run", socketio.run(
flask.current_app,
host='127.0.0.1',
port=5000,
use_reloader=False)
)
但这确实有效。
@manager.command
def run():
socketio.run(flask.current_app,
host='127.0.0.1',
port=5000,
use_reloader=False)
我正在使用应用程序工厂方法创建一个 Flask 应用程序,但是在将 Flask-Migrate 与 socketio 和 flask-script 一起使用时遇到问题。
问题是我正在将 create_app
函数传递给 Manager
,但我还需要将 app
传递给 socketio.run()
。现在我似乎看不到解决方案。有什么办法可以结合这两种解决方案吗?
manage.py:
#app = create_app(False) <--- Old approach
#manager = flask_script.Manager(app)
manager = flask_script.Manager(create_app)
manager.add_option("-t", "--testing", dest="testing", required=False)
manager.add_command("run", socketio.run(
app,
host='127.0.0.1',
port=5000,
use_reloader=False)
)
# DB Management
manager.add_command("db", flask_migrate.MigrateCommand)
当我对 socketio 使用旧方法时,但没有 flask-migrate 一切正常。如果我使用新方法并删除 socketio 部分,则迁移有效。
注意:我希望能够使用以下两个命令调用我的应用程序。
python manage.py run
python manage.py -t True db upgrade
编辑:
尝试使用 current_app
我得到 RuntimeError: working outside of application context
manager.add_command("run", socketio.run(
flask.current_app,
host='127.0.0.1',
port=5000,
use_reloader=False)
)
根据 Miguel 的评论,我找到了一种可行的方法。
由于某些原因,以下代码不起作用
manager.add_command("run", socketio.run(
flask.current_app,
host='127.0.0.1',
port=5000,
use_reloader=False)
)
但这确实有效。
@manager.command
def run():
socketio.run(flask.current_app,
host='127.0.0.1',
port=5000,
use_reloader=False)