क्या किसी ऑब्जेक्ट पर (या के रूप में) गुण सेट किए जाने पर ऑब्जेक्ट पर सत्यापन करने का कोई तरीका है लेकिन सत्र पूरा होने से पहले?क्या एसक्यूएलकेमी ऑब्जेक्ट्स पर पारदर्शी रूप से सत्यापन करने का कोई तरीका है?
उदाहरण के लिए, मेरे पास एक डोमेन मॉडल 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 इस्तेमाल कर सकते हैं सामान्य परिस्थितियों में यह करने के लिए। मुख्य भाग यह है कि मैं इन वर्गों के साथ स्क्लेक्लेमी का उपयोग कर रहा हूं। मुझे समझ में नहीं आता कि कैसे सक्लाक्लेमी अपने जादू का प्रदर्शन कर रहा है लेकिन मुझे संदेह है कि इन गुणों को बनाने और ओवरराइड करने से मुझे अस्थिर और/या अप्रत्याशित परिणाम मिल सकते हैं।
मुझे यकीन है कि जादू SQLAlchemy किस तरह मॉडल वर्ग गुण के लिए बाध्य करने के लिए उपयोग करता है नहीं कर रहा हूँ। मुझे लगता है कि मेरी कक्षा में अपनी 'mac = property() 'को परिभाषित करना सुरक्षित नहीं है। मुझे लगता है कि मेरा सवाल यह सुरक्षित है? यदि हां, तो क्या कोई गठिया है? यदि नहीं, तो कुछ अन्य विकल्प क्या हैं? –
कोई जादू नहीं है। वह कोई गठिया नहीं है। विकल्प वह है जो हम आम तौर पर करते हैं: हम मॉडल वर्ग के बाहर * सत्यापन * करते हैं, जिससे इसे और भी सरल बना दिया जाता है। अपने सत्यापन * मॉडल * के बाहर परिभाषित करें, और फिर आपको इनमें से किसी के बारे में चिंता करने की ज़रूरत नहीं है। –