+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

从Blueprint部署的排队后台工作线程中缺少Flask应用程序上下文

发布于2021-04-12 14:49     阅读(472)     评论(0)     点赞(17)     收藏(2)


0

1

2

3

4

5

我有一个使用工厂功能模式(从入门教程开始)的Flask应用程序,并尝试将长时间运行的工作卸载到具有Redis队列的后台工作人员。我正在从“蓝图”中调用后台工作,并且无法随调用一起传递应用程序上下文。目的是使用应用程序上下文和SQLite配置从后台线程对其执行写操作。我在这里想念什么?我认为这可能更像是一个“您只是对Flask的工作原理不了解”的问题,如果是这种情况,请让我知道我做错了!谢谢。

错误

RuntimeError: Working outside of application context.

dy.py

import sqlite3

import click
from flask import current_app, g
from flask.cli import with_appcontext


def get_db():
    if 'db' not in g:
        g.db = sqlite3.connect(
            current_app.config['DATABASE'],
            detect_types=sqlite3.PARSE_DECLTYPES
        )
        g.db.row_factory = sqlite3.Row
    
    return g.db

蓝图模块:

from flask import (
    Blueprint, flash, g, redirect, render_template, request, url_for, Response, current_app
)
import sqlite3

from app.db import get_db

from rq import Queue
from redis import Redis

bp = Blueprint('perform_work', __name__)
q = Queue(connection=Redis())


def some_func():

    db = get_db()
    ...
    

def generate_work():

    result = q.enqueue(some_func)
    ...


@bp.route('/perform_work', methods=['POST'])
def perform_work():
    ...
    generate_work()

worker.py

import os

import redis
from rq import Worker, Queue, Connection

listen = ['default']

redis_url = os.getenv('REDISTOGO_URL', 'redis://localhost:6379')

conn = redis.from_url(redis_url)


if __name__ == '__main__':
    with Connection(conn):
        worker = Worker(list(map(Queue, listen)))
        worker.work()

解决方案


好吧,我很高兴我猜出来了。应用程序的上下文从未在工作程序中注册过,这应该发生在worker.py中,所以是的,工作程序的人对应用程序本身一无所知。这是注册应用程序上下文的更新后的worker.py:

import os

import redis
from rq import Worker, Queue, Connection
from app import create_app

listen = ['default']

redis_url = os.getenv('REDISTOGO_URL', 'redis://localhost:6379')

conn = redis.from_url(redis_url)

app = create_app()
app.app_context().push()

if __name__ == '__main__':
    with Connection(conn):
        worker = Worker(list(map(Queue, listen)))
        worker.work()

0

1

2

3

4

5

6

7

8

9



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接: https://www.pythonheidong.com/blog/article/936023/0404da734525c56413df/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

17 0
收藏该文
已收藏

评论内容:(最多支持255个字符)