Flask фабричный шаблон с RQ и PyMon go: RuntimeError: Работа вне контекста приложения - PullRequest
0 голосов
/ 16 апреля 2020

Я не могу заставить flask_redis и rq работать в рамках моего flask фабричного шаблона. Я хочу иметь возможность записи в mongodb как часть фоновой задачи, но я получаю следующую ошибку:

RuntimeError: Работа вне контекста приложения.

Обычно это означает, что Вы пытались использовать функциональность, необходимую для взаимодействия с текущим объектом приложения. Чтобы решить эту проблему, настройте контекст приложения с помощью app.app_context (). Дополнительную информацию смотрите в документации.

Все работает нормально, если я исключаю требование записи в дб.

См. Код ниже. Спасибо за любую помощь заранее!

run.py

from app import create_app

app = create_app("config.DevConfig")


if __name__ == "__main__":
    app.run(debug=True)

app / __ init __. Py

from flask import Flask
from flask_redis import FlaskRedis
from rq import Queue
from flask_pymongo import PyMongo

mongo = PyMongo()
r = FlaskRedis()
q = Queue(connection=r)

from app.views import api


def create_app(config):
    app = Flask(__name__, instance_relative_config=False)
    app.config.from_object(config)
    mongo.init_app(app)
    r.init_app(app)
    with app.app_context():
        app.register_blueprint(api)


    return app

app / views.py

from flask import Blueprint
from app import q
from app.tasks import task
from flask import render_template, request

api = Blueprint('apit', __name__)


@api.route("/add-task", methods=["GET"])
def add_task():

    if request.args:
        url = request.args.get("url")
        complete_task = q.enqueue(task, url) 

    return {'message': 'complete'}

app / task.py

from urllib import request
from bs4 import BeautifulSoup
import lxml
from app import mongo
from flask import current_app

def task(url):

    r = request.urlopen(url)
    soup = BeautifulSoup(r.read().decode(), "lxml")

    task_output = foo

    with current_app.app_context():
        mongo.db.jobs.insert_one(task_output)
...