2016-06-23 3 views
3

У меня есть приложение Flask, которое является очень простым приложением с обработчиком POST и некоторыми вставками DB. Вставки DB устанавливаются как задачи с использованием Celery. Если я установил определение и определение экземпляра Celery в файле tasks.py и вызовет функции из моего файла main.py (который также имеет создание приложения Flask), я получаю out of context error. Задачи в файле tasks.py в свою очередь вызывают класс DB, который выполняет вставки БД. Как правильно создать экземпляр Celery и убедиться, что он имеет контекст Flask?В флеш-приложении, где должен быть создан экземпляр Сельдерея?

Это как структура примерно напоминает: создание

  1. main.py = колба приложение, маршруты обработки и tasks.delay вызовов.
  2. tasks.py = Создание экземпляра Celery и определения задач.
  3. DB = Вставки.

Я хочу, чтобы все работало в одном контексте.

+0

Эти ссылки помогли мне Http: //blog.miguelgrinberg. com/post/using-celery-with-flask & http://blog.miguelgrinberg.com/post/celery-and-the-flask-application-factory-pattern –

ответ

1

Флажок docs suggest подклассификация Целевая задача Celery и выполнение задачи обертывания в контексте приложения Flask. Таким образом, в task.py, если ваш экземпляр Колба приложение называется app и ваш экземпляр сельдерея называется celery, вы должны заменить celery «s Задание атрибутов с нового подкласса:

TaskBase = celery.Task 
class ContextTask(TaskBase): 
    abstract = True 
    def __call__(self, *args, **kwargs): 
     with app.app_context(): 
      return TaskBase.__call__(self, *args, **kwargs) 
celery.Task = ContextTask 
+0

Спасибо. Я где-то читал, что мне нужно создать экземпляр Flask в файле, где я начинаю сельдерей. Когда я это делаю, это работает. Но разве это не избыточно? –

+0

Ваш веб-сервер работает отдельно от ваших работников сельдерея, поэтому не лишним иметь два разных примера флеш-приложения. Вы можете избежать дублирования кода, используя [функцию для создания экземпляров приложения] (http://flask.pocoo.org/docs/0.11/config/#configuration-best-practices) (также известный как [фабрика приложений] (http : //flask.pocoo.org/docs/0.11/patterns/appfactories/)). –

+0

Да, действительно, мне удалось это сделать. Но у меня возникли проблемы с импортом фабрики, если мое приложение было вложено в несколько уровней папок. Как и при использовании чертежей. Благодаря! –

Смежные вопросы