Как предоставить доступ к двум БД mongodb, чтобы записывать записи синхронно, после запуска задачи сельдерея? - PullRequest
0 голосов
/ 17 мая 2019

У меня есть две базы данных (а именно, тест и сельдерей). Когда запускается задача сельдерея, она сначала обновляет базу данных «test» с результатами, а затем обновляет базу данных «celery» сообщением об успехе / неудаче. Я защитил эти БД с помощью учетных данных и следовал этому методу: https://medium.com/@matteocontrini/how-to-setup-auth-in-mongodb-3-0-properly-86b60aeef7e8

Теперь, когда я запускаю свою задачу, она выдает мне эту ошибку:

pymongo.errors.OperationFailure: не разрешено для сельдерея выполнять команду {createIndexes: "celery_taskmeta", индексы: [{key: {date_done: 1}, фон: "true", имя: "date_done_1"} ]}

Я использую: mongodb: 3.4 mongoengine: 0,16 django 2.1 и python3

mongoengine.connect(db="test",host=config.host,username="admin_1",
password="admin1234",authentication_source="admin")

CELERY_BROKER_URL = 'redis://localhost:6379'
CELERY_RESULT_BACKEND = "mongodb"
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'

Помимо метода, упомянутого в ссылке выше, я попытался создать пользователя с правами администратора в базе данных администратора следующим образом:

use admin
db.createUser(
 {
   user: "admin_1",
   pwd: "admin1234",
   roles: [ 
{ 
role: "dbOwner",
db: "test" 
},

{ 
role: "userAdminAnyDatabase",
db: "admin" 
},

{ 
role: "dbOwner",
db: "celery" 
}
]
 }
)

Выдает ту же ошибку!

1 Ответ

0 голосов
/ 17 мая 2019

Ошибка происходит из-за сельдерея, он не может создать индекс для коллекции, потому что он не аутентифицирован.

Вы подключаете mongoengine правильно, но в предоставленном фрагменте вы не указываете имя пользователя / пароль в конфигурации celery, поэтому он не может аутентифицироваться (mongoengine является отдельной библиотекой, он не разделяет свое соединение неявно с celery ).

Из того, что я вижу в документах , вы можете указать URI mongodb следующим образом:

CELERY_RESULT_BACKEND = "mongodb://{user}:{password}@127.0.0.1:27017/"

По умолчанию сельдерей будет использовать базу данных "сельдерей", поэтому вам не нужно указывать ее

...