ऐप्लिकेशन शुरू करने से पहले Python पर्यावरण सेटिंग्स का सत्यापन करें
अनुपस्थित और खाली सेटिंग्स को अलग करें, पोर्ट और बूलियन को स्पष्ट रूप से पार्स करें, और गुप्त जानकारी को उजागर किए बिना कॉन्फ़िगरेशन त्रुटियों की रिपोर्ट करें।
इस पृष्ठ पर
संक्षिप्त उत्तर
पर्यावरण सेटिंग्स को स्ट्रिंग के रूप में पढ़ें, ऐप्लिकेशन का कार्य शुरू करने से पहले उन्हें एक बार सत्यापित करें, और प्रत्येक सेटिंग को एक स्पष्ट अनुबंध के अनुसार परिवर्तित करें। एक अनुपस्थित मान, एक खाली मान और एक अमान्य मान अलग-अलग प्रतिक्रिया की मांग कर सकते हैं। न तो os.getenv और न ही configparser आपके ऐप्लिकेशन की कॉन्फ़िगरेशन प्राथमिकता चुनते हैं या स्वचालित रूप से एक .env फ़ाइल लोड करते हैं।
एक घोषणा किए गए अनुबंध के साथ पोर्ट पार्स करें
निम्नलिखित मानक-लाइब्रेरी उदाहरण एक स्ट्रिंग या None स्वीकार करता है। यह दशमलव पूर्णांक रूपांतरण के लिए int का उपयोग करता है और समावेशी सीमा 1 से 65535 तक की जांच करता है। निश्चित संदेश समस्या की पहचान प्रदान किए गए मान को दोहराए बिना करते हैं। सीमा सत्यापन इस बात का प्रमाण नहीं देता कि पोर्ट उपलब्ध है या प्रक्रिया के पास उसे बाइंड करने की अनुमति है।
अनुपस्थित सेटिंग को एक खाली से अलग करें
कोई डिफ़ॉल्ट तर्क नहीं दिए गए, os.getenv("PORT") PORT अनुपस्थित होने पर None लौटाता है। यदि चर खाली मान के साथ मौजूद है, तो यह एक खाली स्ट्रिंग लौटाता है। जब इन अवस्थाओं के अलग-अलग अर्थ होते हैं तो इन्हें अलग-अलग जांचें। उदाहरण के लिए, एक अनुपस्थित वैकल्पिक पोर्ट डिफ़ॉल्ट का उपयोग कर सकता है, जबकि एक स्पष्ट रूप से खाली आवश्यक सेटिंग एक कॉन्फ़िगरेशन त्रुटि उत्पन्न करनी चाहिए।
इस नीति को चुनें कि कच्चा या default_value केवल तभी उपयोग करें जब वह सभी खाली स्ट्रिंग्स को अनुपस्थित मानकर व्यवहार करने की नीति जानबूझकर अपनाती हो। एक सेटिंग को एक बार एक स्थानीय चर में पढ़ें ताकि पार्सिंग, त्रुटि रिपोर्टिंग और बाद के ऐप्लिकेशन प्रारंभ एक ही मान का उपयोग करें।
def parse_port(raw):
if raw is None:
raise ValueError("PORT is missing")
if not isinstance(raw, str):
raise TypeError("PORT must be text")
if not raw.strip():
raise ValueError("PORT is empty")
try:
port = int(raw)
except ValueError:
raise ValueError("PORT must be an integer") from None
if not 1 <= port <= 65535:
raise ValueError("PORT is outside 1..65535")
return port
for sample in ("8080", None, "", "wrong", "65536"):
try:
print(parse_port(sample))
except ValueError as error:
print(error)बूलियन की व्याख्या स्पष्ट रूप से करें
bool("false") True है क्योंकि एक गैर-खाली स्ट्रिंग सत्य है। इसके बजाय, एक समर्थित पाठ्य प्रतिनिधित्व को सामान्य करें और इसे एक स्पष्ट मैपिंग में देखें। आप true, yes, on और 1 को सत्य के रूप में स्वीकार कर सकते हैं, और false, no, off और 0 को असत्य के रूप में; अन्य स्ट्रिंग्स को खारिज करें बजाय इसके कि कोई सुविधा चुपचाप सक्षम हो जाए।
ConfigParser.getboolean(section, option) ConfigParser ऑब्जेक्ट में विकल्पों के लिए ऐसे रूपांतरण प्रदान करता है। यह os.getenv से प्राप्त एक स्ट्रिंग को स्वचालित रूप से रूपांत्रित नहीं करता है। ये अलग-अलग इंटरफ़ेस हैं।
चित्रात्मक परिणाम की सही व्याख्या करें
प्रदान किए गए इनपुट का अनुरेखण 8080 देता है, फिर PORT is missing, PORT is empty, PORT must be an integer, और PORT is outside 1..65535। ये दिखाए गए तर्क के अपेक्षित परिणाम हैं, एक निष्पादित तैनाती परीक्षण की रिपोर्ट नहीं। int कुछ पाठ्य रूप जैसे आसपास के रिक्त स्थान भी स्वीकार करता है; यदि आपके ऐप्लिकेशन अनुबंध को एक कठोरतर शब्दिक नियम की आवश्यकता है तो उसे जोड़ें।
वास्तविक प्रक्रिया के लिए, os को आयात करें और os.getenv("PORT") को फ़ंक्शन में पास करें। किसी वैकल्पिक डिफ़ॉल्ट को चुनने की किसी भी नीति को पार्सर के बाहर रखें, ताकि यह स्पष्ट हो कि क्या एक अनुपस्थित आवश्यक सेटिंग प्रारंभ को रोकनी चाहिए।
उपयोगी कार्य शुरू करने से पहले सत्यापन करें
डेटाबेस से जुड़ने, सुनने वाला सॉकेट खोलने या बैकग्राउंड जॉब शुरू करने से पहले सेटिंग्स इकट्ठा करें और उनका सत्यापन करें। प्रक्रिया supervisor को एक स्पष्ट कॉन्फ़िगरेशन त्रुटि लौटाएं। हर विफलता को पकड़कर अनुमानित डिफ़ॉल्ट के साथ जारी रखने से टूटी हुई तैनाती छिप सकती है।
सत्यापन के बाद, परिवर्तित मानों वाला एक कॉन्फ़िगरेशन ऑब्जेक्ट रखें। हर अनुरोध में पर्यावरण मान को बार-बार पढ़ना और पार्स करना तर्क करने में कठिन होता है और ऐप्लिकेशन के अलग-अलग हिस्सों के अलग-अलग नीतियों का उपयोग करने का कारण बन सकता है।
अपने ऐप्लिकेशन में प्राथमिकता निर्दिष्ट करें
यदि कोई ऐप्लिकेशन कमांड-लाइन तर्क, पर्यावरण चर और INI फ़ाइल का उपयोग करता है, तो यह परिभाषित करें कि कौन सा स्रोत विजेता है। एक संभावित नीति स्पष्ट रूप से दिया गया तर्क, फिर मौजूद पर्यावरण सेटिंग, फिर फ़ाइल विकल्प, फिर दस्तावेज़ीकृत डिफ़ॉल्ट हो सकती है। यह एक ऐप्लिकेशन चयन है, configparser द्वारा लागू कोई अंतर्निर्मित क्रम नहीं।
ConfigParser फ़ाइलें पढ़ सकता है और विकल्प रूपांतरण कर सकता है, लेकिन यह स्वचालित रूप से ऑपरेटिंग सिस्टम पर्यावरण या कमांड-लाइन तर्कों को मर्ज नहीं करता। जब तक कि कोई लॉन्चर या स्पष्ट पुस्तकालय इसे लोड न करे, किसी .env फ़ाइल को पहले से लोड हुआ बताने से बचें।
सेटिंग का नाम बिना उसके गुप्त मान के रिपोर्ट करें
कनेक्शन स्ट्रिंग को शामिल किए बिना, नाम और सत्यापन श्रेणी लॉग करें, जैसे DATABASE_URL अनुपस्थित है। एक टोकन किसी URL के अंदर भी दिख सकता है, न केवल उस सेटिंग में जिसका नाम PASSWORD शामिल करता है। प्रारंभ के निदान के दौरान सभी पर्यावरण चर डंप करने से बचें।
एक गैरगुप्त सेटिंग के लिए, अलग से तय करें कि क्या उसका मान प्रदर्शित करना उचित है। पार्सर उदाहरण स्थिर त्रुटि संदेशों का उपयोग करता है ताकि यह विभाजन सीधा बन सके।
समझें कि प्रक्रिया कॉन्फ़िगरेशन क्या बदलता है
os.environ वर्तमान प्रक्रिया पर्यावरण का प्रतिनिधित्व करता है और जब os आयात किया जाता है तो कैप्चर किया जाता है। इसे अपडेट करने से यह प्रक्रिया बदलती है और यह प्रभावित कर सकती है जिन बच्चों को यह शुरू करती है; यह पहले से चल रही किसी असंबंधित प्रक्रिया का पुनः कॉन्फ़िगर नहीं करता। जब इसकी तैनाती सेटिंग्स बदलें, तो संबंधित सेवा को पुनरारंभ करें या स्पष्ट रूप से पुनः कॉन्फ़िगर करें।
ऑपरेटिंग सिस्टम का व्यवहार भिन्न होता है, जिसमें Windows पर नामों के केस हैंडलिंग शामिल है। बाइट्स पर्यावरण इंटरफ़ेस केवल वहाँ उपलब्ध है जहाँ os.supports_bytes_environ अनुमत करता है। जब तक कि कोई दस्तावेज़ीकृत प्लेटफ़ॉर्म आवश्यकता अन्यथा न माँगे, सामान्य ऐप्लिकेशन कॉन्फ़िगरेशन के लिए सामान्य स्ट्रिंग इंटरफ़ेस का उपयोग करें।
क्या जाँचें
- अनुपस्थित, खाली, बिगड़े हुए और सीमा से बाहर सेटिंग्स के स्पष्ट परिणाम होते हैं।
- ऐप्लिकेशन स्रोत प्राथमिकता परिभाषित करता है बजाय इसके कि माना जाए कि एक पार्सर स्रोतों को मर्ज करता है।
- बूलियन रूपांतरण कच्चे पर्यावरण स्ट्रिंग पर bool का उपयोग नहीं करता है।
- डायग्नोस्टिक्स क्रेडेंशियल्स प्रिंट किए बिना सेटिंग की पहचान करते हैं।
उपयोग की सीमाएँ
यह गाइड मानक-लाइब्रेरी प्रक्रिया कॉन्फ़िगरेशन को कवर करती है। यह एक .env लोडर लागू नहीं करती है, नेटवर्क पोर्ट उपलब्धता की जांच नहीं करती है, या तैनाती अनुमतियों का सत्यापन नहीं करती है। ऐप्लिकेशन-विशिष्ट आवश्यकताओं को आगे सत्यापन की आवश्यकता हो सकती है।