Django'da statik STATIC_URL ve STATIC_ROOT arasındaki fark


127

Kafam karıştı static rootve bazı şeyleri açıklığa kavuşturmak istiyorum.

Django'da statik dosyalar sunmak için aşağıdakiler settings.pyve içinde olmalıdır urls.py:

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

1. Statik dosyaların toplanması gereken dizinin mutlak yolu

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

2. Statik dosyalar için URL öneki

STATIC_URL = '/static/'

3. Statik dosyalar için ek konumlar

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

... ve de urls.pyaşağıdaki satırları:

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

4. Ayrıca kullanıyoruz python manage.py collectstatic

Sorular:

  1. Biri bana iş akışını açıklayabilir mi: İşler ideal olarak nasıl yapılmalıdır? Şu an itibariyle, yukarıdaki kod parçacıklarını belirlenen konumlarına kopyalayıp / yapıştırıyorum ve statik dizinde yeni dosyalar oluşturmaya devam ediyorum ve çalışıyor. Benim içinde settings.STATIC_ROOT, ancak, farklı bir dizine işaret ettiler.

  2. Birisi her bir ortamın iş akışını açıklayabilirse harika olurdu: dosyaların nasıl toplandığı ve yönetildiği ve izlenmesi gereken iyi bir uygulama ne olurdu.

Teşekkürler.


'İş akışını açıklayın' ile ne demek istediğinizi açıklayabilir misiniz? Ayrıca, eğer bölüm 3'te geliştirme yapıyorsanız, url kalıplarınız koşullu olmalıdır. if settings.DEBUG:django'nun statik medyaya hizmet etmede çok iyi olmadığını ekleyerek bunu yapabilirsiniz , bu gerçek bir web sunucusuna bırakılmalıdır.
dm03514

Merhaba @ user993563 İstediğim birkaç forumda çözümü bile bulamıyorum. ama sorularınız bunu açıkça açıklıyor, teşekkürler dostum ... harika iş ...
Mohideen bin Mohammed

İyi Açıklama, Teşekkürler
Ajay Kumar

Yanıtlar:


90

STATIC_ROOT

./manage.py collectstaticDağıtım için statik dosyaların toplanacağı dizinin mutlak yolu . Misal:STATIC_ROOT="/var/www/example.com/static/"

şimdi komut ./manage.py collectstatictüm statik dosyaları (yani uygulamalarınızdaki statik klasördeki, tüm yollardaki statik dosyaları) dizine kopyalayacaktır./var/www/example.com/static/ . şimdi sadece bu dizini apache veya nginx..etc üzerinde sunmanız gerekiyor.

STATIC_URL

URLStatik dosyaları hangi STATIC_ROOTdizine (Apache veya nginx..etc tarafından) sunulmaktadır. Örnek: /static/veyahttp://static.example.com/

Ayarlarsanız STATIC_URL = 'http://static.example.com/', o zaman hizmet etmelidir STATIC_ROOTklasörü (yani "/var/www/example.com/static/"url'deki apache veya nginx tarafından) 'http://static.example.com/'(böylece statik dosyasını referans verebilmek '/var/www/example.com/static/jquery.js'ile 'http://static.example.com/jquery.js')

Şimdi django şablonlarınızda, ona şu şekilde başvurabilirsiniz:

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

hangisini oluşturacak:

<script src="http://static.example.com/jquery.js"></script>

1
Örneğinizle bunun arasındaki fark nedir: href = "{% static" jquery.js "%}"
Kullanıcı

8
@macdonjo hem {{ STATIC_URL }}jquery.jsve {% static "jquery.js" %}aynı. yani ikisi de geri dönecek /static/jquery.js. Daha yeni django sürümleri kullanmanızı önerir {% static "jquery.js" %}, ancak templatetag'i yüklemeniz gerekir, örn {% load staticfiles %}. içinde eski Django sürümü önerir{{STATIC_URL}}
suhailvs

Anlıyorum. Bir sayfa dışında çoğu şablonumun stil sayfamı yüklemesine neden olan bir hata bulmaya çalışıyordum. staticMetot yerine metoda değiştirdim STATIC_URLve hata gitti. Sürümlere dayalı önerilere iyi çağrı.
Kullanıcı

37

STATICFILES_DIRS: Projeniz için statik dosyaları burada tutabilirsiniz, örneğin şablonlarınız tarafından kullanılanlar.

STATIC_ROOT: bunu boş bırakın manage.py collectstatic, bunu yaptığınızda , sisteminizdeki tüm statik dosyaları arayacak ve buraya taşıyacaktır. Statik dosya sunucunuzun bulunduğu her yerde bu klasöre eşlenmesi gerekir. Collectstatic'i çalıştırdıktan sonra kontrol edin ve django'nun oluşturduğu dizin yapısını bulacaksınız.

--------Düzenle----------------

@DarkCygnus tarafından belirtildiği gibi, STATIC_ROOT dosya sisteminizdeki bir dizini işaret etmelidir, Django tarafından doldurulacağı için klasör boş olmalıdır.

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

veya

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

-------- Düzenleme Sonu -----------------

STATIC_URL: '/ static /' genellikle iyidir, sadece statik dosyalar için bir önektir.



2
STATICFILES_DIRSStatik dosyalar için ek dizinler olarak hizmet vermelidir. Tüm css / js / resimlerinizi APP_NAME / static / APP_NAME klasörüne koyarsanız, belirtmenize gerek yoktur STATICFILES_DIRS.
laike9m

Cevabınız için teşekkürler, STATIC_ROOT'u boş bırakmakla ilgili olarak, Collectstatic komutunu çalıştırmadan önce settings.pybunu (yaparak STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')) içinde belirtmem gerekiyordu .
DarkCygnus

Hmm, bunun ne kadar kolay yanıltıcı olabileceğini görebiliyorum. Boş bırakmaktan kastım, genellikle boş başlar, içinde dosya yoktur. Karışıklığı gidermek için cevabı güncelleyeceğim.
keni

2

Yukarıdaki tüm cevaplar faydalıdır ancak hiçbiri sorunumu çözmedi. Üretim dosyamda, STATIC_URL idi https://<URL>/staticve geliştirici settings.py dosyamda aynı STATIC_URL'yi kullandım.

Bu, django / conf / urls / static.py dosyasında sessiz bir hataya neden olur.

Test elif not settings.DEBUG or '://' in prefix: , URL'deki '//' öğesini alır ve statik URL modelini eklemez ve hiçbir statik dosyanın bulunmamasına neden olur.

Django, a http(s)://ile birlikte kullanamayacağınızı belirten bir hata mesajı verirse düşünülmüş olur.DEBUG = True

STATIC_URL'yi "/ statik /" olarak değiştirmek zorunda kaldım

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.