2010-03-05 9 views
15

क्या किसी ऑब्जेक्ट पर (या के रूप में) गुण सेट किए जाने पर ऑब्जेक्ट पर सत्यापन करने का कोई तरीका है लेकिन सत्र पूरा होने से पहले?क्या एसक्यूएलकेमी ऑब्जेक्ट्स पर पारदर्शी रूप से सत्यापन करने का कोई तरीका है?

उदाहरण के लिए, मेरे पास एक डोमेन मॉडल Device है जिसमें mac संपत्ति है। मैं यह सुनिश्चित करना चाहता हूं कि mac संपत्ति में डेटाबेस में जोड़ा या अपडेट होने से पहले एक वैध और sanitized मैक मान शामिल है।

ऐसा लगता है कि पाइथोनिक दृष्टिकोण अधिकांश चीजों को गुणों (SQLAlchemy सहित) करना है। अगर मैंने इसे PHP या जावा में कोड किया था, तो संभवतः मैंने डेटा की सुरक्षा के लिए गेटटर/सेटर विधियों को बनाने का विकल्प चुना होगा और मुझे डोमेन मॉडल में इसे संभालने के लिए लचीलापन दिया होगा।

public function mac() { return $this->mac; } 
public function setMac($mac) { 
    return $this->mac = $this->sanitizeAndValidateMac($mac); 
} 
public function sanitizeAndValidateMac($mac) { 
    if (! preg_match(self::$VALID_MAC_REGEX)) { 
     throw new InvalidMacException($mac); 
    } 
    return strtolower($mac); 
} 

एक pythonic तरीका स्थिति के इस प्रकार SQLAlchemy का उपयोग कर संभाल करने में क्या है?

(हालांकि मुझे पता है कि सत्यापन और कहीं और संभाला जाना चाहिए (यानी, वेब ढांचा) मैं इन डोमेन विशिष्ट सत्यापन नियमों को संभालने के तरीके को समझना चाहता हूं क्योंकि वे अक्सर आने वाले हैं।)

अद्यतन

मुझे पता है कि मैं property इस्तेमाल कर सकते हैं सामान्य परिस्थितियों में यह करने के लिए। मुख्य भाग यह है कि मैं इन वर्गों के साथ स्क्लेक्लेमी का उपयोग कर रहा हूं। मुझे समझ में नहीं आता कि कैसे सक्लाक्लेमी अपने जादू का प्रदर्शन कर रहा है लेकिन मुझे संदेह है कि इन गुणों को बनाने और ओवरराइड करने से मुझे अस्थिर और/या अप्रत्याशित परिणाम मिल सकते हैं।

उत्तर

2

"ऐसा लगता है कि pythonic दृष्टिकोण की तरह गुण के रूप में सबसे काम करने के लिए है"

यह बदलता रहता है, लेकिन यह है कि करीब है।

"अगर मैं PHP या जावा में इस कोडित था, मैं शायद गेटर/सेटर तरीकों बनाने के लिए चुना है, होगा ..."

अच्छा। वह पाइथोनिक पर्याप्त है। आपके गेटटर और सेटर फ़ंक्शन एक संपत्ति में बंधे हैं; वह बहुत बढिया है।

प्रश्न क्या है?

क्या आप पूछ रहे हैं कि property कैसे वर्तनी करें?

हालांकि, "पारदर्शी सत्यापन" - यदि मैं आपका उदाहरण कोड सही ढंग से पढ़ता हूं - वास्तव में यह सब अच्छा विचार नहीं हो सकता है।

आपका मॉडल और आपकी सत्यापन शायद अलग रखा जाना चाहिए। एक मॉडल के लिए एकाधिक सत्यापन होना आम बात है। कुछ उपयोगकर्ताओं के लिए, फ़ील्ड वैकल्पिक, निश्चित या उपयोग नहीं किए जाते हैं; इससे कई सत्यापन होते हैं।

सत्यापन के लिए Form का उपयोग करने के लिए Django डिज़ाइन पैटर्न के बाद आप खुश रहेंगे, मॉडल को अलग फॉर्म बनाएं।

+2

मुझे यकीन है कि जादू SQLAlchemy किस तरह मॉडल वर्ग गुण के लिए बाध्य करने के लिए उपयोग करता है नहीं कर रहा हूँ। मुझे लगता है कि मेरी कक्षा में अपनी 'mac = property() 'को परिभाषित करना सुरक्षित नहीं है। मुझे लगता है कि मेरा सवाल यह सुरक्षित है? यदि हां, तो क्या कोई गठिया है? यदि नहीं, तो कुछ अन्य विकल्प क्या हैं? –

+0

कोई जादू नहीं है। वह कोई गठिया नहीं है। विकल्प वह है जो हम आम तौर पर करते हैं: हम मॉडल वर्ग के बाहर * सत्यापन * करते हैं, जिससे इसे और भी सरल बना दिया जाता है। अपने सत्यापन * मॉडल * के बाहर परिभाषित करें, और फिर आपको इनमें से किसी के बारे में चिंता करने की ज़रूरत नहीं है। –

7

हां। यह MapperExtension का उपयोग करके अच्छी तरह से किया जा सकता है।

# uses sqlalchemy hooks to data model class specific validators before update and insert 
class ValidationExtension(sqlalchemy.orm.interfaces.MapperExtension): 
    def before_update(self, mapper, connection, instance): 
     """not every instance here is actually updated to the db, see http://www.sqlalchemy.org/docs/reference/orm/interfaces.html?highlight=mapperextension#sqlalchemy.orm.interfaces.MapperExtension.before_update""" 
     instance.validate() 
     return sqlalchemy.orm.interfaces.MapperExtension.before_update(self, mapper, connection, instance) 
    def before_insert(self, mapper, connection, instance): 
     instance.validate() 
     return sqlalchemy.orm.interfaces.MapperExtension.before_insert(self, mapper, connection, instance) 


sqlalchemy.orm.mapper(model, table, extension = ValidationExtension(), **mapper_args) 

आप before_update संदर्भ की जांच करने के क्योंकि यहाँ नहीं हर मामले वास्तव में डाटाबेस को अद्यतन किया जाता है सकते हैं।

13

आप @validates() सजावट का उपयोग कर अपने एसक्यूएलकेमी कक्षाओं के भीतर डेटा सत्यापन जोड़ सकते हैं।

डॉक्स से - Simple Validators:

एक विशेषता सत्यापनकर्ता विशेषता के मूल्य परिवर्तनशील करने की प्रक्रिया को रोकने, एक अपवाद को बढ़ा सकते हैं, या कुछ अलग में दिए गए मूल्य बदल सकते हैं।

from sqlalchemy.orm import validates 

class EmailAddress(Base): 
    __tablename__ = 'address' 

    id = Column(Integer, primary_key=True) 
    email = Column(String) 

    @validates('email') 
    def validate_email(self, key, address): 
     # you can use assertions, such as 
     # assert '@' in address 
     # or raise an exception: 
     if '@' not in address: 
      raise ValueError('Email address must contain an @ sign.') 
     return address 
+0

बस एक त्वरित प्रश्न: यदि मुझे सरल "उपस्थिति" सत्यापन चाहिए, तो क्या मुझे कॉलम घोषणा में 'nullable = false' जोड़ना चाहिए और फिर' session.commit() 'त्रुटियों को पकड़ने का प्रयास करें? या मुझे एक समान वैधकर्ता की कोशिश करनी चाहिए? धन्यवाद। –

संबंधित मुद्दे

 संबंधित मुद्दे