Я не могу заставить 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)