# Dokumentasi Django 5.2.8

# 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. Your storage class must implement the `_open()` and `_save()` methods, along with any other methods appropriate to your storage class. See below for more on these methods.

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

4. Your storage class must be deconstructible so it can be serialized when it's used on a field in a migration. As long as your field has arguments that are themselves serializable, you can use the `django.utils.deconstruct.deconstructible` class decorator for this (that's what Django uses on FileSystemStorage).

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

- `Storage.delete()`

- `Storage.exists()`

- `Storage.listdir()`

- `Storage.size()`

- `Storage.url()`

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.

DIpanggil oleh `Storage.open()`, ini adalah mekanisme sebenarnya kelas penyimpanan menggunakan untuk membuka berkas. Ini harus mengembalikan objek `File`, meskipun dalam kebanyakan kasus, anda akan ingin mengembalikan beberapa subkelas disini yang menerapkan logika khusus pada sistem penyimpanan backend. Pengecualian `FileNotFoundError` harus dimunculkan ketika berkas tidak ada.

_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.

Harus mengembalikan nama sebenarnya dari berkas disimpan (biasanya `name` dilewatkan, tetapi jika penyimpanan butuh merubah nama berkas mengembalikan nama baru sebagai gantinya).

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.

## Gunakan mesin penyimpanan penyesuaian anda

Langkah pertama untuk menggunakan penyimpanan penyesuaian anda dengan Django adalah memberitahu Django tetnang berkas backend penyimpanan anda sedang gunakan.. Ini dilakukan dengan pengaturan `STORAGES`. Pengaturan ini memetakan nama lain penyimpanan, yang merupakan cara merujuk pada penyumpanan khusus di Django, pada pengaturan dictionary untuk backend penyimpanan khusus itu. Pengaturan dalam dictionary terdalam digambarkan sepenuhnya dalam dokumentasi `STORAGES`.

Penyimpanan dapat diakses oleh nama lain dari dictionary `django.core.files.storage.storages`:

    from django.core.files.storage import storages

    example_storage = storages["example"]