Django 2.1 - Managing files

फाइलों का प्रबंधन




django

फाइलों का प्रबंधन

यह दस्तावेज़ एक उपयोगकर्ता द्वारा अपलोड की गई फ़ाइलों के लिए Django के फ़ाइल एक्सेस एपीआई का वर्णन करता है। निचले स्तर के API सामान्य रूप से पर्याप्त होते हैं जिनका उपयोग आप अन्य उद्देश्यों के लिए कर सकते हैं। यदि आप "स्टैटिक फाइल्स" (जेएस, सीएसएस आदि) को हैंडल करना चाहते हैं, तो स्टैटिक फाइल्स (जैसे इमेज, जावास्क्रिप्ट, सीएसएस) को मैनेज करना देखें

डिफ़ॉल्ट रूप से, Django, MEDIA_ROOT और MEDIA_URL सेटिंग्स का उपयोग करके स्थानीय रूप से फ़ाइलों को संग्रहीत करता है। नीचे दिए गए उदाहरण मानते हैं कि आप इन चूक का उपयोग कर रहे हैं।

हालाँकि, Django कस्टम फ़ाइल स्टोरेज सिस्टम लिखने के तरीके प्रदान करता है जो आपको पूरी तरह से अनुकूलित करने की अनुमति देता है कि Django फ़ाइलों को कहाँ और कैसे संग्रहीत करता है। इस दस्तावेज़ का दूसरा भाग बताता है कि ये संग्रहण प्रणालियां कैसे काम करती हैं।

मॉडल में फ़ाइलों का उपयोग करना

जब आप एक FileField या ImageField उपयोग करते हैं, तो Django एपीआई का एक सेट प्रदान करता है जिसका उपयोग आप उस फ़ाइल से निपटने के लिए कर सकते हैं।

फोटो को स्टोर करने के लिए ImageField का उपयोग करके निम्नलिखित मॉडल पर विचार करें:

from django.db import models

class Car(models.Model):
    name = models.CharField(max_length=255)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    photo = models.ImageField(upload_to='cars')

किसी भी Car उदाहरण में एक photo विशेषता होगी जिसे आप संलग्न फोटो के विवरण में प्राप्त करने के लिए उपयोग कर सकते हैं:

>>> car = Car.objects.get(name="57 Chevy")
>>> car.photo
<ImageFieldFile: chevy.jpg>
>>> car.photo.name
'cars/chevy.jpg'
>>> car.photo.path
'/media/cars/chevy.jpg'
>>> car.photo.url
'http://media.example.com/cars/chevy.jpg'

यह ऑब्जेक्ट - उदाहरण में car.photo - एक File ऑब्जेक्ट है, जिसका अर्थ है कि इसमें नीचे वर्णित सभी विधियां और विशेषताएं हैं।

ध्यान दें

फ़ाइल को डेटाबेस में मॉडल को सहेजने के हिस्से के रूप में सहेजा जाता है, इसलिए डिस्क पर उपयोग किए जाने वाले वास्तविक फ़ाइल नाम को मॉडल के सहेजे जाने तक पर निर्भर नहीं किया जा सकता है।

उदाहरण के लिए, आप फ़ाइल का name फ़ाइल संग्रहण के स्थान ( MEDIA_ROOT यदि आप डिफ़ॉल्ट FileSystemStorage MEDIA_ROOT का उपयोग कर रहे हैं) के सापेक्ष फ़ाइल का name सेट करके बदल सकते हैं:

>>> import os
>>> from django.conf import settings
>>> initial_path = car.photo.path
>>> car.photo.name = 'cars/chevy_ii.jpg'
>>> new_path = settings.MEDIA_ROOT + car.photo.name
>>> # Move the file on the filesystem
>>> os.rename(initial_path, new_path)
>>> car.save()
>>> car.photo.path
'/media/cars/chevy_ii.jpg'
>>> car.photo.path == new_path
True

File ऑब्जेक्ट

आंतरिक रूप से, Django एक django.core.files.File का उपयोग करता है django.core.files.File उदाहरण के लिए किसी भी समय किसी फ़ाइल का प्रतिनिधित्व करने की आवश्यकता होती है।

अधिकांश समय आप बस एक ऐसी File उपयोग करेंगे जो Django ने आपको दी है (यानी ऊपर दी गई मॉडल से जुड़ी एक फ़ाइल, या शायद एक अपलोड की गई फ़ाइल)।

यदि आपको स्वयं एक File बनाने की आवश्यकता है, तो सबसे आसान तरीका है कि आप पायथन बिल्ट-इन file ऑब्जेक्ट का उपयोग करके एक बना सकते हैं:

>>> from django.core.files import File

# Create a Python file object using open()
>>> f = open('/path/to/hello.world', 'w')
>>> myfile = File(f)

अब आप django.core.files.File वर्ग के किसी भी प्रलेखित विशेषताओं और विधियों का उपयोग कर सकते हैं।

ज्ञात हो कि इस तरह से बनाई गई फाइलें अपने आप बंद नहीं होती हैं। निम्न दृष्टिकोण का उपयोग फ़ाइलों को स्वचालित रूप से बंद करने के लिए किया जा सकता है:

>>> from django.core.files import File

# Create a Python file object using open() and the with statement
>>> with open('/path/to/hello.world', 'w') as f:
...     myfile = File(f)
...     myfile.write('Hello World')
...
>>> myfile.closed
True
>>> f.closed
True

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

IOError: [Errno 24] Too many open files

फ़ाइल भंडारण

पर्दे के पीछे, Django एक फाइल स्टोरेज सिस्टम में फ़ाइलों को कैसे और कहां स्टोर करना है, इसके बारे में निर्णय लेता है। यह वह वस्तु है जो वास्तव में फाइल सिस्टम, फाइल खोलने और पढ़ने आदि जैसी चीजों को समझता है।

Django की डिफ़ॉल्ट फ़ाइल संग्रहण DEFAULT_FILE_STORAGE सेटिंग द्वारा दी गई है; यदि आप स्पष्ट रूप से भंडारण प्रणाली प्रदान नहीं करते हैं, तो यह वह है जिसका उपयोग किया जाएगा।

अंतर्निहित डिफ़ॉल्ट फ़ाइल संग्रहण प्रणाली के विवरण के लिए नीचे देखें, और अपनी स्वयं की फ़ाइल संग्रहण प्रणाली लिखने की जानकारी के लिए एक कस्टम संग्रहण प्रणाली लिखना देखें।

भंडारण वस्तुओं

हालाँकि, अधिकांश समय आप एक File ऑब्जेक्ट (जो उस फ़ाइल के लिए उचित संग्रहण को दर्शाता है) का उपयोग करना चाहते हैं, आप सीधे फ़ाइल स्टोरेज सिस्टम का उपयोग कर सकते हैं। आप कुछ कस्टम फ़ाइल संग्रहण वर्ग का एक उदाहरण बना सकते हैं, या - अक्सर अधिक उपयोगी - आप वैश्विक डिफ़ॉल्ट भंडारण प्रणाली का उपयोग कर सकते हैं:

>>> from django.core.files.base import ContentFile
>>> from django.core.files.storage import default_storage

>>> path = default_storage.save('/path/to/file', ContentFile('new content'))
>>> path
'/path/to/file'

>>> default_storage.size(path)
11
>>> default_storage.open(path).read()
'new content'

>>> default_storage.delete(path)
>>> default_storage.exists(path)
False

फ़ाइल संग्रहण API के लिए फ़ाइल संग्रहण API देखें।

अंतर्निहित फ़ाइल सिस्टम संग्रहण वर्ग

Django के जहाज एक FileSystemStorage वर्ग के साथ, जो बुनियादी स्थानीय फाइल सिस्टम स्टोरेज को लागू करता है।

उदाहरण के लिए, निम्नलिखित कोड /media/photos तहत अपलोड की गई फ़ाइलों को स्टोर करेगा चाहे आपकी MEDIA_ROOT सेटिंग कुछ भी हो:

from django.core.files.storage import FileSystemStorage
from django.db import models

fs = FileSystemStorage(location='/media/photos')

class Car(models.Model):
    ...
    photo = models.ImageField(storage=fs)

कस्टम स्टोरेज सिस्टम उसी तरह काम करते हैं: आप उन्हें FileField में storage तर्क के रूप में पास कर सकते हैं।