2012-09-02 23 views
22

मैं एक पायथन मॉड्यूल लिख रहा हूं जिसमें कुछ फ़ंक्शन होंगे जो एक mongodb डेटाबेस में हेरफेर करेंगे।सरल डेटा सत्यापन

डेटाबेस में सहेजने से पहले उस फ़ंक्शन को पास किए गए इनपुट डेटा को सत्यापित करने के बारे में मैं कैसे जा सकता हूं?

उदाहरण के लिए, मान लें कि मॉड्यूल में फ़ंक्शन में से एक createUser(user) है जो एक पायथन शब्दकोश को तर्क के रूप में स्वीकार करता है। इस शब्दकोश में डेटाबेस में सहेजने के लिए उपयोगकर्ता जानकारी शामिल है। मैं एक स्वचालित सत्यापन दिनचर्या बनाना चाहता हूं जो जांचता है कि शब्दकोश संरचना डेटाबेस संरचना से मेल खाती है।

+0

मैं इस से वास्तव में परिचित नहीं हूं, लेकिन मुझे लगता है कि आप एक ओआरएम का उपयोग करना चाहेंगे (http://stackoverflow.com/questions/2781682/mongodb-orm-for-python देखें) - हालांकि आप खो देंगे एक NoSQL डीबी की लचीलापन। –

+0

धन्यवाद। मैं ओआरएम का उपयोग करने की संभावना के बारे में जानता हूं लेकिन इस मामले में मैं सीधे मोंगोडीबी डेटाबेस में हेरफेर करना चाहता हूं। – anujkk

+2

https://github.com/nicolaiarocci/cerberus/। मुझे कामुक पसंद है लेकिन अब सेर्बरस पसंद करते हैं। सभी नियमों को मानवीय पठनीय यामल फ़ाइल में घोषित किया जा सकता है, जो कि उदार और अन्य पुस्तकालयों में कॉलबेल की आवश्यकता के विपरीत है। – chishaku

उत्तर

2

मैंने दो दिन पहले "पायवारू" (https://github.com/daveoncode/pyvaru) जारी किया था, यह सत्यापन नियमों की अवधारणा के आधार पर पाइथन 3 (3.4+) के लिए एक सरल, लचीला और अविभाज्य डेटा सत्यापन पुस्तकालय है। दस्तावेज़ से

उद्धरण:

मान्य करने के लिए एक मौजूदा मॉडल को देखते हुए, नीचे एक की तरह (लेकिन यह एक साधारण शब्दकोश या किसी डेटा संरचना के बाद से pyvaru डेटा पर किसी भी धारणा नहीं है हो सकता है प्रारूप):

class User: 
    def __init__(self, first_name: str, last_name: str, date_of_birth: datetime, sex: str): 
     self.first_name = first_name 
     self.last_name = last_name 
     self.date_of_birth = date_of_birth 
     self.sex = sex 

हम get_rules() विधि को लागू करने से और प्रत्येक क्षेत्र हम मान्य करने के लिए हम एक या अधिक उचित नियम (रों) प्रदान करने के लिए चाहते हैं के लिए, एक सत्यापनकर्ता परिभाषित करने के लिए किया है।

एक संदर्भ प्रोसेसर के रूप में::

from pyvaru import Validator 
from pyvaru.rules import TypeRule, FullStringRule, ChoiceRule, PastDateRule 

class UserValidator(Validator): 
    def get_rules(self) -> list: 
     user = self.data # type: User 
     return [ 
      TypeRule(apply_to=user, 
        label='User', 
        valid_type=User, 
        error_message='User must be an instance of user model.', 
        stop_if_invalid=True), 
      FullStringRule(user.first_name, 'First name'), 
      FullStringRule(user.last_name, 'Last name'), 
      ChoiceRule(user.sex, 'Sex', choices=('M', 'F')), 
      PastDateRule(user.date_of_birth, 'Date of birth') 
     ] 

अंत में हम कैसे हमारे कस्टम सत्यापनकर्ता का उपयोग करने के बारे में दो विकल्प हैं

with UserValidator(user): 
    # do whatever you want with your valid model 

कोड के अंदर इस मामले में साथ ही अगर निष्पादित किया जाएगा प्रमाणीकरण सफल होता है, अन्यथा प्रमाणीकरण अपवाद (उचित रिपोर्ट के साथ validation_result संपत्ति) उठाया जाता है।

सत्यापित करें() विधि (जो एक ValidationResult रिटर्न)

validation = UserValidator(user).validate() 
if validation.is_successful(): 
    # do whatever you want with your valid model 
else: 
    # you can take a proper action and access validation.errors 
    # in order to provide a useful message to the application user, 
    # write logs or whatever 

लागू मान लिया जाये कि हम एक उपयोगकर्ता नीचे एक के रूप में विन्यस्त का एक उदाहरण है द्वारा:

user = User(first_name=' ', 
      last_name=None, 
      date_of_birth=datetime(2020, 1, 1), 
      sex='unknown') 

के साथ एक मान्यता चलाकर पिछले परिभाषित नियमों को हम निम्नलिखित त्रुटियों के साथ एक सत्यापन प्रमाणीकरण प्राप्त करेंगे:

{ 
    'First name': ['String is empty.'], 
    'Last name': ['Not a string.'], 
    'Sex': ['Value not found in available choices.'], 
    'Date of birth': ['Not a past date.'] 
}