Perbedaan antara STATIC_URL statik dan STATIC_ROOT pada Django

127

Saya bingung static rootdan ingin mengklarifikasi sesuatu.

Untuk melayani berkas statis dalam Django, berikut ini harus dalam settings.pydan urls.py:

import os
PROJECT_DIR=os.path.dirname(__file__)

1. Path absolut ke direktori tempat file statis harus dikumpulkan

STATIC_ROOT= os.path.join(PROJECT_DIR,'static_media/')

2. Awalan URL untuk file statis

STATIC_URL = '/static/'

3. Lokasi tambahan untuk file statis

STATICFILES_DIRS = ( os.path.join(PROJECT_DIR,'static/'),)

... dan di urls.pybaris berikut:

from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += patterns('', (
    r'^static/(?P<path>.*)$',
    'django.views.static.serve',
    {'document_root': settings.STATIC_ROOT}
))

4. Kami juga menggunakan python manage.py collectstatic

Pertanyaan:

  1. Adakah yang bisa menjelaskan alur kerja kepada saya: bagaimana seharusnya hal-hal idealnya dilakukan. Sekarang, saya menyalin / menempelkan cuplikan kode di atas ke lokasi yang ditentukan dan terus membuat file baru di direktori statis dan berhasil. Dalam saya settings.STATIC_ROOT, bagaimanapun, saya telah menunjuk ke direktori yang berbeda.

  2. Akan sangat bagus jika seseorang dapat menjelaskan alur kerja setiap pengaturan: bagaimana file dikumpulkan dan dikelola, dan praktik yang baik untuk diikuti.

Terima kasih.

pengguna993563
sumber
Bisakah Anda menjelaskan apa yang Anda maksud dengan 'menjelaskan alur kerja'? juga pola url Anda harus bersyarat jika Anda mengembangkan di bagian 3. Anda dapat melakukan ini dengan menambahkan if settings.DEBUG:django tidak terlalu baik dalam melayani media statis, ini harus diserahkan ke server web yang sebenarnya.
dm03514
Hai @ user993563 i cant bahkan menemukan solusi di beberapa forum apa yang saya inginkan. tapi pertanyaan Anda menjelaskan dengan jelas terima kasih man ... kerja bagus ...
Mohideen bin Mohammed
Penjelasan yang Baik, Terima kasih
Ajay Kumar

Jawaban:

89

STATIC_ROOT

Jalur absolut ke direktori tempat ./manage.py collectstaticmengumpulkan file statis untuk penerapan. Contoh:STATIC_ROOT="/var/www/example.com/static/"

sekarang perintah ./manage.py collectstaticakan menyalin semua file statis (yaitu di folder statis di aplikasi Anda, file statis di semua jalur) ke direktori /var/www/example.com/static/. sekarang Anda hanya perlu melayani direktori ini di apache atau nginx..etc.

STATIC_URL

Di URLmana file-file statis dalam STATIC_ROOTdirektori disajikan (oleh Apache atau nginx..etc). Contoh: /static/atauhttp://static.example.com/

Jika Anda mengatur STATIC_URL = 'http://static.example.com/', maka Anda harus melayani STATIC_ROOTfolder (yaitu "/var/www/example.com/static/") oleh apache atau nginx di url 'http://static.example.com/'(sehingga Anda dapat merujuk file statis '/var/www/example.com/static/jquery.js'dengan 'http://static.example.com/jquery.js')

Sekarang di django-templates Anda, Anda dapat merujuknya dengan:

{% load static %}
<script src="{% static "jquery.js" %}"></script>

yang akan membuat:

<script src="http://static.example.com/jquery.js"></script>
suhailvs
sumber
1
Apa perbedaan antara contoh Anda dan ini: href = "{% static" jquery.js "%}"
Pengguna
8
@macdonjo baik {{ STATIC_URL }}jquery.jsdan {% static "jquery.js" %}yang sama. yaitu keduanya akan kembali /static/jquery.js. Versi django yang lebih baru merekomendasikan untuk digunakan {% static "jquery.js" %}, tetapi Anda perlu memuat templatetag, mis {% load staticfiles %}. dalam versi django yang lebih lama merekomendasikan{{STATIC_URL}}
suhailvs
Saya melihat. Saya mencoba menemukan bug yang menyebabkan sebagian besar template saya memuat stylesheet saya kecuali satu halaman. Saya mengubahnya ke staticmetode alih-alih STATIC_URLmetode, dan bug itu hilang. Panggilan bagus atas saran berdasarkan versi.
Pengguna
37

STATICFILES_DIRS: Anda dapat menyimpan file statis untuk proyek Anda di sini, misalnya yang digunakan oleh template Anda.

STATIC_ROOT: biarkan kosong, jika Anda melakukannya manage.py collectstatic, ini akan mencari semua file statis di sistem Anda dan memindahkannya ke sini. Server file statis Anda seharusnya dipetakan ke folder ini di mana pun lokasinya. Periksa setelah menjalankan collectstatic dan Anda akan menemukan struktur direktori yang telah dibangun oleh django.

-------- Edit ----------------

Seperti ditunjukkan oleh @DarkCygnus, STATIC_ROOT harus menunjuk ke direktori pada sistem berkas Anda, map tersebut harus kosong karena akan diisi oleh Django.

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

atau

STATIC_ROOT = '/opt/web/project/static_files'

-------- Akhiri Edit -----------------

STATIC_URL: '/ static /' biasanya baik-baik saja, ini hanya awalan untuk file statis.

keni
sumber
2
Di sini, tautan ke manajemen file statis di 1.3 docs.djangoproject.com/en/1.3/howto/static-files
keni
2
STATICFILES_DIRSharus berfungsi sebagai direktori tambahan untuk file statis. Jika Anda meletakkan semua css / js / gambar Anda ke dalam folder APP_NAME / static / APP_NAME, maka tidak perlu ditentukan STATICFILES_DIRS.
laike9m
Terima kasih atas jawabannya, tentang membiarkan STATIC_ROOT kosong, saya sebenarnya harus menentukannya di settings.py(dengan melakukan STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')) sebelum menjalankan perintah collectstatic .
DarkCygnus
Hmm, saya bisa melihat betapa mudahnya hal ini menyesatkan. Yang saya maksud dengan membiarkannya kosong adalah biasanya dimulai dengan kosong, tidak ada file di dalamnya. Saya akan memperbarui jawaban untuk menghilangkan kebingungan.
keni
2

Semua jawaban di atas bermanfaat tetapi tidak ada yang menyelesaikan masalah saya. Dalam file produksi saya, STATIC_URL saya adalah https://<URL>/staticdan saya menggunakan STATIC_URL yang sama di file dev settings.py saya.

Ini menyebabkan kegagalan diam-diam dalam django / conf / urls / static.py.

Tes elif not settings.DEBUG or '://' in prefix: mengambil '//' di URL dan tidak menambahkan pola URL statis, menyebabkan tidak ada file statis yang ditemukan.

Akan bijaksana jika Django mengeluarkan pesan kesalahan yang menyatakan Anda tidak dapat menggunakan http(s)://denganDEBUG = True

Saya harus mengubah STATIC_URL menjadi '/ static /'

MIkee
sumber