Bagaimana menulis kelas penyimpanan disesuaikan

Jika anda butuh untuk menyediakan penyimpanan berkas disesuaikan -- contoh umum adalah menyimpan berkas di beberapa sistem terpencil -- anda dapat melakukannya dengan menentukan kelas penyimpanan disesuaikan. Anda akan butuh mengikuti langkah-langkah ini:

  1. Sistem penyimpanan disesuaikan anda harus subkelas dari django.core.files.storage.Storage:

    from django.core.files.storage import Storage
    
    
    class MyStorage(Storage): ...
    
  2. Django harus dapat memberikan contoh sistem penyimanan disesuaikan anda tanpa argumen apapun. Ini berarti bahwa setiap pengaturan harus diambil dari 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. Kelas penyimpanan anda harus menerapkan metode _open() dan _save() , bersama dengan cara lainnya sesuai pada kelas penyimpanan anda. Lihat dibawah untuk lebih pada cara ini.

    Sebagai tambahan, jika kelas anda menyediakan penyimpanan berkas lokal, itu harus menimpa metode path().

  4. Kelas penyimpanan anda harus deconstructible sehingga dia dapat di serialkan ketika digunakan pada bidang dalam sebuah perpindahan. Selama bidang anda mempunyai argumen yang mereka sendiri serializable, anda dapat menggunakan kelas decorator untuk ini (itu mengapa Django digunakan pada FileSystemStorage).

Secara awalan, metode berikut memunculkan NotImplementedError dan akan khususnya ditimpa:

Catat bagaimanapun bahwa tidak semua metode ini diwajibkan dan mungkin sengaja dihilangkan. Ketika itu terjadi, itu memungkinkan meninggalkan setiap cara tidak diterapkan dan masih memiliki Penyimpanan bekerja.

Sebagai contoh, jika mencantumkan isi dari backend penyimpanan tertentu ternyata mahal, anda mungkin memutuskan tidak menerapkan Storage.listdir().

Cara lain akan menjadi backend yang ahnya menangani penulisan ke berkas. Dalam kasus ini, anda tidak akan butuh menerapkan apapun metode diatas.

Akhirnya, metode mana yang anda terapkan terserah anda. Meninggalkan beberapa cara tidak diterapkan akan menghasilkan antarmuka sebagian (kemungkinan rusak).

Anda akan juga ingin menggunakan penghubung khususnya dirancang untuk obyek penyimpanan disesuaikan. Ini adalah:

_open(name, mode='rb')

Wajib.

Called by Storage.open(), this is the actual mechanism the storage class uses to open the file. This must return a File object, though in most cases, you'll want to return some subclass here that implements logic specific to the backend storage system. The FileNotFoundError exception should be raised when a file doesn't exist.

_save(name, content)

Dipanggil oleh Storage.save(), name sudah telah melalui get_valid_name() dan get_available_name(), dan content akan menjadi obyek File itu sendiri.

Should return the actual name of the file saved (usually the name passed in, but if the storage needs to change the file name return the new name instead).

get_valid_name(name)

Mengembalikan sebuah nama berkas yang cocok untuk digunakan dengan sistem penyimpanan pokok. Argumen name dilewati ke cara ini antara berkas nama asli dikirim ke peladen atau, jika upload_to adalah callable, nama berkas dikembalikan oleh cara tersebut setelah informasi jalur dipindahkan. Kesampingkan ini untuk menyesuaikan bagaimana karakter bukan-standar dirubah ke nama berkas aman.

Kode disediakan di Storage hanya mempertahankan karakter alpanumerik, titik dan garis bawah dari nama berkas asli, memindahkan semua yang lainnya.

get_alternative_name(file_root, file_ext)

Mengembalikan nama berkas lain berdasarkan pada parameter file_root dan file_ext. Secara awalan, sebuah garis bawah ditambah 7 karakter string alfanumerik acak ditambahkan ke nama berkas sebelum ekstensi.

get_available_name(name, max_length=None)

Mengembalikan nama berkas yang tersedia di mekanisme penyimpanan, barangkali mengambil nama berkas tersedia ke dalam akun. argumen name dilewati ke cara ini akan sudah dibersihkan ke nama berkas sah untuk sistem penyimpanan, menurut cara get_valid_name() digambarkan diatas.

Panjang dari nama berkas tidak melebihi max_length, jika disediakan. Jika nama berkas unik bebas tidak dapat ditemukan, sebuah pengecualian SuspiciousFileOperation muncul.

Jika sebuah berkas dengan name sudah ada, get_alternative_name() dipanggil untuk mendapatkan nama alternatif.

Use your custom storage engine

New in Django 4.2.

The first step to using your custom storage with Django is to tell Django about the file storage backend you'll be using. This is done using the STORAGES setting. This setting maps storage aliases, which are a way to refer to a specific storage throughout Django, to a dictionary of settings for that specific storage backend. The settings in the inner dictionaries are described fully in the STORAGES documentation.

Storages are then accessed by alias from the django.core.files.storage.storages dictionary:

from django.core.files.storage import storages

example_storage = storages["example"]
Back to Top