Тот, кто подключает Celery к Django, использует как правило, пакет django-celery-results для использования таблицы специальной модели Django в качестве хранилища результатов выполнения задач Celery.

Вероятно, через какое-то время, у вас возникнет желание заменить такую таблицу на что-то другое, например облачное хранилище.

Как известно всем продвинутым разработчикам под Django, в этой системе реализована концепция независимого от бакенда хранилища для файлов.

Подробности про хранилище

Базовый класс, декларирующий интерфейс такого хранилища, это django.core.files.storage.Storage.Сама Django предлагает ровно одну реализацию, django.core.files.storage.FileSystemStorage, однако этот недостаток легко ликвидируется использованием пакета django-storages. Изначальная такое хранилище используется для сохранения содержимого FileField и его наследников.

Пакет django-storages реализует файловое хранилище для большинства систем облачного хранения файлов, таких как Amazon AWS S3, Google Cloud, или Microsoft Azure. Я хочу воспользоваться этим пакетом, чтобы Celery могла хранить результаты в облачном хранилище Google Cloud.

Celery и сама умеет в облако

Действительно, в документации имеется раздел о бакендах, в том числе, облачных. К сожалению, бакенд для Google Cloud отсутствует, так что использование Django Storage для подключения такого хранилища, является полезной опцией.

Естественно, что интерфейс хранилища файлов Django
отличается от интерфейса хранилища результатов Celery. Поэтому чтобы подружить их, требуется тонкая прослойка, преобразующая запросы от одного к другому.

Именно этим занимается пакет Django Storage Celery Results, который я написал.

После установки пакета

pip install django-storage-celery-results

укажите его в списке использованных в файле settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    ...
    'django_storage_celery_results',
    ...
]

Настройте Celery для использования пакета

CELERY_RESULT_BACKEND = 'django-storage'

Теперь, нужно указать, какой именно бакенд Django Storage нужно использовать. Я хочу использовать Google Storage, поэтому напишу:

CELERY_RESULT_STORAGE = 'storages.backends.gcloud.GoogleCloudStorage'

Я хочу задать индивидуальную конфигурацию для Google Cloud, которая будет использована только для хранения результатов, поэтому напишу конфигурацию, которая будет использована только для этой цели:

А как еще можно?

Еще можно написать часть или всю конфигурацию, которая будет использована не только для хранения результатов, но и для хранения файлов FileField. Для этого вы можете воспользоваться переменными settings.py, описанными в документации для указанного хранилища файлов. Например, для Google Cloud, вы можете указать общий файл авторизации сервисного аккаунта, который будет использован и для размещения результатов, и для размещения файлов соответствующих FileField:

GS_CREDENTIALS = Credentials.from_service_account_file('google_service_secrets.json')

Тогда размещать ссылку на этот же файл в переменной ниже, уже не будет необходимости

from google.oauth2.service_account import Credentials

CELERY_RESULT_STORAGE_CONFIG = {
    'credentials': Credentials.from_service_account_file('google_service_secrets.json'),
    'bucket_name': 'celery-results',
    'location': 'celery-results/develop'
}

В этом коде подразумевается, что файл, в который вы сохранили параметры входа при создании сервисного аккаунта, называется google_service_secrets.json.

Не забудьте установить нужные библиотеки для доступа в Google Cloud

Доступ в Google Cloud из пакета django-storages обеспечивается установкой пакета https://pypi.org/project/google-cloud-storage/:

pip install google-cloud-storage

Комментарии (0)