如何在Flask中使用Celery为会话添加值?

时间:2017-10-30 13:25:33

标签: python flask celery

我创建了一个为会话添加值的任务,然后我可以通过浏览器访问它,我的芹菜运行得很好,这是我的代码

from flask import session, g
from ..extensions import celery

CELERYBEAT_SCHEDULE = {
    'add-every-10-seconds': {
        'task': 'tasks.ruble',
        'schedule': timedelta(seconds=20)
    }
}

@celery.task(name='tasks.ruble')
def ruble():
    url = 'https://finance.google.com/finance/converter?a=1&from=KGS&to=RUB&meta=ei%3DmSr0WeHCCYvBsAH8n6OIBA'
    urlHandler = urllib2.urlopen(url)
    html = urlHandler.read()
    bsoup = BeautifulSoup(html, 'lxml')
    num = bsoup.find('span').text.split()[0]
    g.get('ruble', float(num))
    session['get_ruble'] = float(num)

但是当执行任务时,它最终会出现此错误:

[2017-10-30 19:19:29,372: ERROR/PoolWorker-4] Task tasks.ruble[ff7617ad-764b-455c-b541-96f3ba78a87b] raised unexpected: RuntimeError('Working outside of request context.\n\nThis typically means that you attempted to use functionality that needed\nan active HTTP request.  Consult the documentation on testing for\ninformation about how to avoid this problem.',)
Traceback (most recent call last):
  File "/home/xakep/Desktop/work/optomvse/venv/local/lib/python2.7/site-packages/celery/app/trace.py", line 367, in trace_task
    R = retval = fun(*args, **kwargs)
  File "/home/xakep/Desktop/work/optomvse/celery_worker.py", line 21, in __call__
    return TaskBase.__call__(self, *args, **kwargs)
  File "/home/xakep/Desktop/work/optomvse/venv/local/lib/python2.7/site-packages/celery/app/trace.py", line 622, in __protected_call__
    return self.run(*args, **kwargs)
  File "/home/xakep/Desktop/work/optomvse/develop/tasks.py", line 34, in ruble
    session['get_ruble'] = float(num)
  File "/home/xakep/Desktop/work/optomvse/venv/local/lib/python2.7/site-packages/werkzeug/local.py", line 350, in __setitem__
    self._get_current_object()[key] = value
  File "/home/xakep/Desktop/work/optomvse/venv/local/lib/python2.7/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/home/xakep/Desktop/work/optomvse/venv/local/lib/python2.7/site-packages/flask/globals.py", line 37, in _lookup_req_object
    raise RuntimeError(_request_ctx_err_msg)
RuntimeError: Working outside of request context.

This typically means that you attempted to use functionality that needed
an active HTTP request.  Consult the documentation on testing for
information about how to avoid this problem.

我忘了提到的另一件事是,我还尝试使用g代替会话,只需将float(num)值分配给它g.ruble = float(num),但在我的模板中如果我键入{{g.ruble}}没有打印出来。

1 个答案:

答案 0 :(得分:0)

如果值不断更改将其存储在某处(Redis /任何数据库),并且来自用户的请求刚刚更新API调用中的会话数据。

session['get_ruble'] = get_stored_value()

由于异步任务中没有请求上下文,因此无法异步更新会话数据。

只是一个建议:

如果值是动态的而不是将其存储在会话中,您可以提供单独的API来获取最新数据。