Как я могу программно определить, является ли команда Pymongo быть чтением или записи для логики разрешения (без резко -Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу программно определить, является ли команда Pymongo быть чтением или записи для логики разрешения (без резко -

Сообщение Anonymous »

Я строю систему авторизации/контроля доступа в приложении Python, в котором используется Pimongo для доступа к MongoDB. Мне нужно динамически решить-во время выполнения и для произвольных форм запросов-будь то заданная команда MongoDB, выпущенная через Pimongo, является операцией чтения или записи, чтобы разделить обработку на чтения, выполненные в против. .insert_one () вызовы. Например, он может запустить сложные агрегации, карты-восстановление, find_and_modify и т. Д. Уровень, поэтому он должен работать до того, как команды будут переданы в MongoDB. Я обнаружил, что драйвер node.js выявляет наборы команд с записи, но Pimongo не делает. Это использует поведение реплик MongoDB:

Подход: Вы временно отправляете команду вторичному члену набора копий (с помощью readpreference = вторичное ). Если команда выполняется без ошибки, это операция чтения. Если он терпит неудачу с «не первичным», «notwriteprimary» или аналогичными ошибками/кодами, это запись. Основная проблема с этим будет: что, если вторичный член не существует при выполнении проверки, я проверил, и это принесло бы ошибку, и поэтому мы не сможем узнать, чтение или нет.OperationFailure, проверка сообщений об ошибках и кодах. Это работает в моих первоначальных тестах, но я хочу быть уверенным в правильности и эффективности. Путь? /> Вот эскиз дистиллированного кода о том, что я делаю: < /p>
from pymongo import MongoClient, ReadPreference
from pymongo.errors import NotPrimaryError, OperationFailure

def is_read_command(db, command):
try:
secondary_db = db.with_options(read_preference=ReadPreference.SECONDARY)
secondary_db.command(command)
return True
except (NotPrimaryError, OperationFailure) as exc:
err_msg = str(exc)
if getattr(exc, "code", None) in (10107, 13435) or "not primary" in err_msg.lower() or "not master" in err_msg.lower():
return False
raise


Подробнее здесь: https://stackoverflow.com/questions/797 ... -write-for
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Код Visual Studio, не видя pymongo «ModuleNotFoundError», установил pymongo с помощью pip. Почему он не видит пимонго?
    Anonymous » » в форуме Python
    0 Ответы
    46 Просмотры
    Последнее сообщение Anonymous
  • Реализация встроенной логики петли с многопоточным чтением в C ++
    Anonymous » » в форуме C++
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • EF Core View — размещение логики бизнес-логики
    Anonymous » » в форуме C#
    0 Ответы
    43 Просмотры
    Последнее сообщение Anonymous
  • Размещение логики ввода и логики обработки в C ++ [закрыто]
    Anonymous » » в форуме C++
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Команда последней записи точки управления доступом к записи возвращает все записи.
    Anonymous » » в форуме Android
    0 Ответы
    107 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»