Bagaimana mengelola berkas statik (misalnya gambar, JavaScript, CSS)¶
Situs jaringan pada umumnya butuh melayani tambahan berkas-berkas seperti gambar, JavaScript, atau CSS. Di Django, kami mengacu pada berkas-berkas ini sebagai "berkas-berkas tetap". Django menyediakan django.contrib.staticfiles
untuk membantu anda mengelola mereka.
Halaman ini menggambarkan bagaimana anda dapat melayani berkas statis ini.
Mengkonfigurasi berkas-berkas tetap¶
Pastikan bahwa
django.contrib.staticfiles
disertakan dalamINSTALLED_APPS
anda.Di berkas pengaturan anda, tentukan
STATIC_URL
, sebagai contoh:STATIC_URL = "static/"
In your templates, use the
static
template tag to build the URL for the given relative path using the configuredstaticfiles
STORAGES
alias.{% load static %} <img src="{% static 'my_app/example.jpg' %}" alt="My image">
Simpan berkas tetap di pelipat disebut
static
di aplikasi anda. Sebagai contohmy_app/static/my_app/example.jpg
.
Melayani berkas-berkas
Dalam tambahan pada langkah-langkah konfigurasi ini, anda akan juga butuh untuk melayani berkas-berkas tetap.
Selama pengembangan, jika anda menggunakan django.contrib.staticfiles
, ini akan dilakukan otomatis oleh runserver
ketika DEBUG
disetel ke True
(lihat django.contrib.staticfiles.views.serve()
).
Cara ini adalah terlalu tidak efesien dan mungkin tidak aman, jadi dia tidak cocok untuk produksi.
Lihat Bagaimana menyebarkan berkas tetap untuk strategi yang sesuai untuk melayani berkas-berkas tetap dalam lingkungan produksi.
Proyek anda mungkin juga mempunyai aset tetap yang tidak diikat pada aplikasi khusus. Dalam tambahan untuk menggunakan direktori static/
didalam aplikasi anda, anda dapat menentukan sebuah daftar direktori (STATICFILES_DIRS
) di berkas pengaturan anda dimana Django akan juga mencari untuk berkas-berkas tetap. Sebagai contoh:
STATICFILES_DIRS = [
BASE_DIR / "static",
"/var/www/static/",
]
Lihat dokumentasi untuk pengaturan STATICFILES_FINDERS
untuk rincian pada bagaimana staticfiles
menemukan berkas-berkas anda.
Namespacing berkas statis
Sekarang kami mungkin bisa lolos dengan menaruh berkas statis langsung dalam my_app/static/
(daripada membuat subdirektori my_app` lain), tetapi itu merupakan ide buruk. Django akan menggunakan berkas statis pertama menemukan nama yang cocok, dan jika anda memiliki berkas statis dengan nama sama dalam aplikasi berbeda, Django tidak akan dapat membedakan diantara mereka. Kami butuh dapat menunjuk Django pada satu yg benar, dan cara terbaik memastikan ini dengan melakukan namespace mereka. Itu dia, dengan menaruh berkas statis tersebut dalam direktori lain dinamai untuk aplikasi itu sendiri.
Anda dapat me-namespace aset statis di STATICFILES_DIRS
by specifying prefixes.
Melayani berkas-berkas tetap selama pengembangan¶
Jika anda menggunakan django.contrib.staticfiles
seperti yang dijelaskan diatas, runserver
akan melakukan ini secara otomatis ketika DEBUG
disetel ke True
. Jika anda tidak mempunyai django.contrib.staticfiles
di INSTALLED_APPS
, anda dapat masih secara manual melayani berkas-berkas tetap menggunakan tampilan django.views.static.serve()
.
Ini tidak cocok untuk penggunaan produksi! Untuk beberapa strategi penyebaran umum, lihat Bagaimana menyebarkan berkas tetap.
Sebagai contoh, jika STATIC_URL
anda ditentukan sebagai static/
, anda dapat melakukan ini dengan menambahkan potongan berikut ke urls.py
anda:
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
Catatan
Fungsi pembantu ini hanya bekerja dalam suasana mencari kesalahan dan hanya jika awalan diberikan adalah lokal (misalnya static/
) dan bukan URL (misalnya http://static.example.com/
).
Juga fungsi pembantu ini hanya melayani folder STATIC_ROOT
sebenarnya; dia tidak menampilkan berkas-berkas tetap seperti django.contrib.staticfiles
.
Akhirnya, berkas status dilayani melalui pembungkus pada lapisan aplikasi WSGI. Sebagai konsekuensinya, berkas statis meminta untuk tidak melewatkan melalui middleware chain biasa.
Melayani berkas-berkas terunggah oleh pengguna selama pengembangan¶
Selama pengembangan, anda dapat melayani berkas-berkas media diupload-pengguna dari MEDIA_ROOT
menggunakan tampilan django.views.static.serve()
.
Ini tidak cocok untuk penggunaan produksi! Untuk beberapa strategi penyebaran umum, lihat Bagaimana menyebarkan berkas tetap.
Sebagai contoh, jika MEDIA_URL
anda ditentukan sebagai media/
, anda dapat melakukan ini dengan menambahkan potongan berikut ke ROOT_URLCONF
anda:
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Catatan
Fungsi pembantu ini hanya bekerja dalam suasana mencari kesalahan dan hanya jika awalan diberikan adalah lokal (misalnya media/
) dan bukan URL (misalnya http://media.example.com/
).
Pengujian¶
Ketika menjalankan percobaan yang menggunakan permintaan HTTP sebenarnya daripada klien percobaan siap pakai (yaitu ketika menggunakan LiveServerTestCase
siap pakai) aset tetap butuh dilayani bersama sisa dari isi sehingga lingkungan percobaan memproduksi kembali satu yang asli setepat mungkin, tetapi LiveServerTestCase
mempunyai hanya sangat dasar berkas tetap-melayani fungsi: Dia tidak tahu bahwa penemu fitur dari aplikasi staticfiles
dan menganggap isi statis telah dikumpulkan dibawah STATIC_ROOT
.
Karena ini, staticfiles
mengemas django.contrib.staticfiles.testing.StaticLiveServerTestCase
milik dia sendiri, sebuah subkelas dari satu siap pakai yang mempunyai kemampuan untuk transparan melayani semua aset selama pelaksanaan dari percobaan ini dengan cara sangat mirip pada apa kami dapat di waktu pengembangan dengan DEBUG = True
, yaitu tanpa mengumpulkan mereka menggunakan collectstatic
pertama kali.
Penyebaran¶
django.contrib.staticfiles
menyediakan kenyamanan perintah pengelolaan untuk mengumpulkan berkas-berkas tetap dalam direktori tunggal sehingga anda dapat melayani mereka dengan mudah.
Setel pengaturan
STATIC_ROOT
ke direktori dari dimana anda ingin melayani berkas-berkas ini, sebagai contoh:STATIC_ROOT = "/var/www/example.com/static/"
Run the
collectstatic
management command:$ python manage.py collectstatic
Ini akan menyalin semua berkas dari pelipat tetap anda kedalam direktori
STATIC_ROOT
.Gunakan sebuah peladen jaringan dari pilihan anda untuk melayani berkas-berkas. Bagaimana menyebarkan berkas tetap melingkupi beberapa strategi penyebaran umum untuk berkas-berkas tetap.
Pelajari lagi¶
Dokumen ini melingkupi corak penggunaan dasar dan beberapa umum. Untuk melengkapi rincian pada semua pengaturan, perintah, etiket cetakan, dan potongan lainnya disertakan dalam django.contrib.staticfiles
, lihat the acuan berkas tetap.