Django 2.1 - Writing a custom storage system

कस्टम स्टोरेज सिस्टम लिखना




django

कस्टम स्टोरेज सिस्टम लिखना

यदि आपको कस्टम फ़ाइल संग्रहण प्रदान करने की आवश्यकता है - एक सामान्य उदाहरण कुछ दूरस्थ सिस्टम पर फ़ाइलें संग्रहीत कर रहा है - तो आप कस्टम स्टोरेज क्लास को परिभाषित करके ऐसा कर सकते हैं। आपको इन चरणों का पालन करना होगा:

  1. आपका कस्टम स्टोरेज सिस्टम django.core.files.storage.Storage उपवर्ग होना चाहिए:

    from django.core.files.storage import Storage
    
    class MyStorage(Storage):
        ...
    
  2. Django बिना किसी तर्क के आपके स्टोरेज सिस्टम को इंस्टेंट करने में सक्षम होना चाहिए। इसका मतलब है कि किसी भी सेटिंग को django.conf.settings से लिया जाना चाहिए:

    from django.conf import settings
    from django.core.files.storage import Storage
    
    class MyStorage(Storage):
        def __init__(self, option=None):
            if not option:
                option = settings.CUSTOM_STORAGE_OPTIONS
            ...
    
  3. आपके संग्रहण वर्ग को _open() और _save() विधियों को लागू करना चाहिए, साथ ही आपके संग्रहण वर्ग के लिए उपयुक्त किसी भी अन्य तरीके के साथ। इन तरीकों पर अधिक जानकारी के लिए नीचे देखें।

    इसके अलावा, यदि आपकी कक्षा स्थानीय फ़ाइल संग्रहण प्रदान करती है, तो उसे path() विधि को ओवरराइड करना होगा।

  4. आपका स्टोरेज क्लास deconstructible होना चाहिए, इसलिए जब इसे माइग्रेशन में किसी फ़ील्ड पर उपयोग किया जाता है तो इसे सीरियल किया जा सकता है। जब तक आपके क्षेत्र में ऐसे तर्क हैं जो स्वयं serializable , आप इसके लिए django.utils.deconstruct.deconstructible क्लास डेकोरेटर का उपयोग कर सकते हैं (जो कि Django FileSystemStorage पर उपयोग करता है)।

डिफ़ॉल्ट रूप से, निम्न विधियाँ NotImplementedError और आम तौर पर ओवरराइड करना होगा:

ध्यान दें कि इन सभी तरीकों की आवश्यकता नहीं है और जानबूझकर छोड़ा जा सकता है। जैसा कि ऐसा होता है, प्रत्येक विधि को अनिमित रूप से छोड़ना संभव है और अभी भी एक कार्यशील भंडारण है।

उदाहरण के अनुसार, यदि कुछ संग्रहण बैकेंड की सामग्री को सूचीबद्ध करना महंगा हो जाता है, तो आप Storage.listdir को लागू नहीं करने का निर्णय ले सकते हैं।

एक अन्य उदाहरण एक बैकएंड होगा जो केवल फाइलों को लिखने का काम करता है। इस मामले में, आपको उपरोक्त तरीकों में से कोई भी लागू करने की आवश्यकता नहीं होगी।

अंततः, इनमें से कौन सी पद्धति लागू की गई है, यह आप पर निर्भर है। कुछ तरीकों को लागू करने से आंशिक (संभवतः टूट गया) इंटरफ़ेस का परिणाम होगा।

आप आमतौर पर विशेष रूप से कस्टम संग्रहण ऑब्जेक्ट के लिए डिज़ाइन किए गए हुक का उपयोग करना चाहते हैं। य़े हैं:

_open(name, mode='rb')

आवश्यक है

Storage.open() द्वारा कॉल किया जाता है, यह फ़ाइल खोलने के लिए स्टोरेज क्लास का वास्तविक तंत्र है। यह एक File ऑब्जेक्ट वापस करना होगा, हालांकि ज्यादातर मामलों में, आप यहाँ कुछ उपवर्ग वापस करना चाहेंगे जो कि बैकवर्ड स्टोरेज सिस्टम के लिए तर्क को लागू करता है।

_save(name, content)

Storage.save() द्वारा कहा जाता है। name पहले से ही get_valid_name() और get_available_name() माध्यम से चला जाएगा, और content स्वयं एक File ऑब्जेक्ट होगी।

बचाई गई फ़ाइल के नाम का वास्तविक नाम वापस करना चाहिए (आमतौर पर name पास हो जाता है, लेकिन अगर भंडारण को फ़ाइल नाम बदलने की आवश्यकता है तो इसके बजाय नया नाम लौटाएं)।

get_valid_name(name)

अंतर्निहित भंडारण प्रणाली के साथ उपयोग के लिए उपयुक्त एक फ़ाइल नाम लौटाता है। इस पद्धति को दिया गया name तर्क या तो सर्वर पर भेजा गया मूल फ़ाइल नाम है या, यदि upload_to एक upload_to है, तो किसी भी पथ जानकारी को हटा दिए जाने के बाद उस विधि द्वारा दिया गया फ़ाइल नाम। गैर-मानक वर्णों को सुरक्षित फ़ाइलनाम में कैसे परिवर्तित किया जाए, इसे अनुकूलित करने के लिए इसे ओवरराइड करें।

Storage पर दिया गया कोड मूल अल्फा नाम से केवल अल्फा-न्यूमेरिक कैरेक्टर, पीरियड्स और अंडरस्कोर रखता है, बाकी सब हटा देता है।

get_available_name(name, max_length=None)

एक फ़ाइल नाम देता है जो भंडारण तंत्र में उपलब्ध है, संभवतः प्रदान किए गए फ़ाइलनाम को ध्यान में रखते हुए। इस विधि को पास किया गया name तर्क पहले ही ऊपर वर्णित get_valid_name() विधि के अनुसार, स्टोरेज सिस्टम के लिए मान्य फ़ाइल नाम को साफ कर चुका होगा।

यदि प्रदान की जाती है, तो फ़ाइल नाम की लंबाई अधिकतम से अधिक नहीं होगी। यदि एक मुक्त विशिष्ट फ़ाइल नाम नहीं मिल सकता है, तो एक SuspiciousFileOperation अपवाद उठाया जाता है।

यदि name फ़ाइल पहले से मौजूद है, तो एक अंडरस्कोर प्लस एक यादृच्छिक 7 वर्ण अल्फ़ान्यूमेरिक स्ट्रिंग एक्सटेंशन से पहले फ़ाइल नाम में जोड़ा जाता है।