我检查了文档,得出的结论是,仅包装导致with app.test_request_context():
中异常的代码即可解决我的问题。没有,with app.app_context():
我希望看到的是:每6秒调用一次tick()
都无关紧要在我的应用程序的特定页面上-重定向到td_list(列出所有ToDO)和flash
邮件。
请问有人可以模拟我的问题吗?
我在学习Flask中遵循自上而下的方法。我不了解多线程,这可能与我的问题有关(假设我运行Flask服务器并使用apscheduler
,并在适当的时候尝试调用tick()
)。
工作“滴答声(触发:间隔[0:00:06],下次运行时间:2019-11-28 21:59:32 EET)”引发了异常
RuntimeError:在外部运行 请求上下文。
这通常意味着您尝试使用 需要一个有效的HTTP请求。查阅有关测试的文档 有关如何避免此问题的信息。
这在routes.py
中:
@app.route("/tick", methods=['GET', 'POST'])
def tick():
with app.app_context():
flash("Something", 'info')
return redirect(url_for('td_list'))
def Schedule_reminders():
with app.test_request_context():
if os.environ.get("WERKZEUG_RUN_MAIN") == "true":
# https://stackoverflow.com/questions/9449101/how-to-stop-flask-from-initialising-twice-in-debug-mode
scheduler = BackgroundScheduler()
scheduler.add_job(tick, 'interval', seconds=6)
scheduler.start()
在创建Schedule_reminders()
之后,我在__init__.py
中呼叫app
:
app = Flask(__name__)
app.config['SECRET_KEY'] = '57916sdkfhsdfs0c676dsdsa80ba245'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
db = SQLAlchemy(app)
migrate = Migrate(app, db)
bcrypt = Bcrypt(app)
from flaskblog import routes
routes.Schedule_reminders()