Wie kann ich programmgesteuert feststellen, ob ein Pymongo -Befehl eine Lesen oder Schreiben für die Berechtigungslogik Python

Python-Programme
Anonymous
 Wie kann ich programmgesteuert feststellen, ob ein Pymongo -Befehl eine Lesen oder Schreiben für die Berechtigungslogik

Post by Anonymous »

Ich erstelle ein Autorisierungs-/Zugangskontrollsystem in einer Python -Anwendung, die Pymongo zum Zugang zu MongoDB verwendet. Ich muss dynamisch entscheiden-zur Laufzeit und für willkürliche Abfrageberationen-, ob ein bestimmter MongoDB-Befehl über Pymongo eine Lese- oder Schreiboperation ist, um die Verarbeitung in read-probiertes vs. Schreibbenutzer aufzuteilen. .insert_one () Anrufe. Zum Beispiel kann es komplexe Aggregationen, Map-Reduce, find_and_modify usw. ausführen. Es muss funktionieren, bevor Befehle an MongoDB übergeben werden. Ich fand, dass der Node.js-Treiber beschreibbare Befehlssätze enthüllt, aber Pymongo nicht. Dynamischer Ansatz, der das Replikat -Set -Verhalten von MongoDB nutzt:

Ansatz: Sie senden den Befehl vorübergehend an ein sekundäres Mitglied des Replikat -Sets (unter Verwendung von ReadPreference = Secondary ). Wenn der Befehl ohne Fehler ausgeführt wird, handelt es sich um eine Leseoperation. Wenn es mit "nicht primär", "nicht abgeschriebenemPrimary" oder ähnlichen Fehlern/Codes fehlschlägt, ist es ein Schreiben. Das Hauptproblem wäre: Was wäre, wenn ein sekundäres Mitglied nicht vorhanden ist, wenn der Scheck durchgeführt wird, ich überprüft habe und es würde einen Fehler werfen und wir würden daher nicht wissen, ob es sich um eine Lektüre handelt oder nicht.

Code: Select all

OperationFailure
, Überprüfen Sie Fehlermeldungen und Codes. Dies funktioniert in meinen ersten Tests, aber ich möchte sicher sein, dass Korrektheit und Effizienz. WEGEN? /> Hier ist eine destillierte Code-Skizze dessen, was ich tue: < /p>

Code: Select all

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

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post