请教 flask apscheduler 问题

2022-05-15 13:57:22 +08:00
 AerithLoveMe
我在 flask 里使用 apscheduler ,进行定时任务创建的时候报
RuntimeError: Working outside of application context.

缺少上下文,网上找了一大堆没解决,问问各位大神这怎么办?

目录结构:

-project
--task
---job(任务包装)
---scheduler(调度器包装)
--app(启动)
--notify(蓝图)

具体就是我在 notify 里面通过接口动态创建定时任务,任务触发了,但是会报这个错误
3000 次点击
所在节点    Python
11 条回复
westoy
2022-05-15 14:01:08 +08:00
可以参考官方文档那个集成 celery 的例子, 简单的说调用都要包在 with app.app_context()里, 不过你这个把 flask 和 apscheduler 包一起的需求我感觉有问题......
AerithLoveMe
2022-05-15 14:03:57 +08:00
@westoy flask 一般不用 apscheduler 了吗?我刚上手。。
Macv1994
2022-05-15 14:10:48 +08:00
可以参考我这个代码(代码很垃圾) https://github.com/weijiang1994/Blogin/blob/master/blogin/task.py#L29

你这个报错是没有在 flask 应用的上下文环境中执行,我记得 flask-asp 的例子有比较详细的代码。
westoy
2022-05-15 14:14:17 +08:00
@AerithLoveMe

不是 python 的问题啊, 一般 web 和定时任务都是拆开来的, 不会放一起的。 至于 python , 部署在多核上肯定多进程啊, 你到时候每个进程一个 apscheduler , 然后还要做同步判断, 不然一个任务几个进程各跑一遍......python 跑定时任务直接用现成的中间件一般也是 rq 或者 cerlery 的, 你真的要用 apscheduler , 建议单独跑一个服务, 用 0mq 或者 redis pubsub 去通讯
zcf0508
2022-05-15 14:50:52 +08:00
我直接用的 flask-sqlalchemy ,没碰到过类似问题
zcf0508
2022-05-15 14:51:31 +08:00
@zcf0508 写错了,是 flask-apscheduler
cz5424
2022-05-15 16:10:23 +08:00
支持一楼的,上下文问题,报错信息是因为需要 with app.app_context()里执行
chaleaochexist
2022-05-16 00:51:46 +08:00
如果能提供一个最小可重现代码。会得到有效回答。否则大家只能靠猜。
ebingtel
2022-05-16 13:59:57 +08:00
具体就是我在 notify 里面通过接口动态创建定时任务,任务触发了,但是会报这个错误

你应该是在 apscheduler 里面引用了 current_app, request 之类的对象、但是又不在 app_context 等上下文里面……简单的解决: 把需要的参数提取出来,直接传入到 apscheduler 函数里面,避免引用
l4ever
2022-05-26 20:35:51 +08:00
@chaleaochexist 没什么好猜的, 提示很清楚就是上下文导致的, 用一楼的方法
敲上
from app.exts import db
with db.app_context():
再拿出游标卡尺, 把你写的逻辑锁进一个 tab 就行了
rev1si0n
2022-05-30 14:46:29 +08:00
@westoy 我在同进程内集成了 grpc + tornado + apscheduler + asyncio ,works as expected ,暂没有发现问题,不过我确实没什么建议给题主,毕竟情况不一。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/852943

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX