V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
AerithLoveMe
V2EX  ›  Python

请教 flask apscheduler 问题

  •  
  •   AerithLoveMe · 2022-05-15 13:57:22 +08:00 · 2997 次点击
    这是一个创建于 923 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我在 flask 里使用 apscheduler ,进行定时任务创建的时候报
    RuntimeError: Working outside of application context.

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

    目录结构:

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

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

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

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

    你应该是在 apscheduler 里面引用了 current_app, request 之类的对象、但是又不在 app_context 等上下文里面……简单的解决: 把需要的参数提取出来,直接传入到 apscheduler 函数里面,避免引用
    l4ever
        10
    l4ever  
       2022-05-26 20:35:51 +08:00
    @chaleaochexist 没什么好猜的, 提示很清楚就是上下文导致的, 用一楼的方法
    敲上
    from app.exts import db
    with db.app_context():
    再拿出游标卡尺, 把你写的逻辑锁进一个 tab 就行了
    rev1si0n
        11
    rev1si0n  
       2022-05-30 14:46:29 +08:00
    @westoy 我在同进程内集成了 grpc + tornado + apscheduler + asyncio ,works as expected ,暂没有发现问题,不过我确实没什么建议给题主,毕竟情况不一。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2713 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 00:06 · PVG 08:06 · LAX 16:06 · JFK 19:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.