Django'nun koleksiyon istatistiklerinin amacı nedir?


91

Bu muhtemelen aptalca bir soru, ama sadece kafamı tıklamak değil.

Django'da kural, uygulamanıza özgü tüm statik dosyalarınızı (yani css, js) statik adı verilen bir klasöre koymaktır . Yani yapı şöyle görünecektir:

mysite/
    manage.py
    mysite/ --> (settings.py, etc)
    myapp/ --> (models.py, views.py, etc)
        static/

In mysite/settings.pyI sahiptir:

STATIC_ROOT = 'staticfiles'

Yani komutu çalıştırdığımda:

python manage.py collectstatic   

staticfilesKök düzeyinde adında bir klasör oluşturur (aynı dizin myapp/)

Bunun anlamı ne? Tüm statik dosyalarımın bir kopyasını oluşturmak değil mi?

Yanıtlar:


72

Birden çok uygulamadan statik dosyaları tek bir yolda toplayın

Eh, tek Django projesi birkaç kullanabilir uygulamaları yalnızca bir tane varken bu yüzden, myappbu aslında olabilir myapp1, myapp2vb

Bunları ayrı uygulamaların içinden tek bir klasöre kopyalayarak, ön uç web sunucunuzu (örneğin nginx) o tek klasöre yönlendirebilirsiniz. STATIC_ROOT web sunucunuzu birden çok yoldan statik dosyalar sunacak şekilde yapılandırmak yerine ve statik dosyaları tek bir konumdan sunabilirsiniz. .

ManifestStaticFilesStorage ile Kalıcı URL'ler

MD5 karma hakkında bir not sürüm için dosya adına ekleniyor: Bu varsayılan davranışı bir parçası değil collectstaticgibi settings.STATICFILES_STORAGEhiç varsayılan StaticFilesStorage(bunu yapmaz ki)

MD5 hash'i, örneğin, kullanmak üzere ayarlarsanız ManifestStaticFilesStorage, bu davranışı hangi reklamlarla gösterir.

Bu depolamanın amacı, bazı sayfaların hala bu dosyalara başvurması durumunda, örneğin sizin tarafınızdan veya üçüncü taraf bir proxy sunucusu tarafından önbelleğe alındığı için eski dosyaları sunmaya devam etmektir. Ek olarak, sonraki sayfa ziyaretleri için yükleme süresini hızlandırmak için dağıtılan dosyalara uzak gelecekteki Expires başlıklarını uygulamak çok yararlıdır.


3
Statik içeriği sunmak için web sunucusunu bulmanın kolay olacağını söylemek istiyorsun
babygame0ver

45

Django statik dosyaları birçok yerde olabilir. Olarak görev bir dosya /static/img/icon.pngolabilir birçok yerde gelmektedir . Varsayılan olarak:

  • FileSystemFinderarayacaktır img/icon.pngher birinde STATICFILES_DIRS,
  • AppDirectoriesFinderarayacaktır img/icon.pngiçinde static, aramalarınızdan her alt klasöründe INSTALLED_APPS. Bu, Django Admin gibi kitaplıkların kendi statik dosyalarını uygulamanıza eklemesine izin verir.

Şimdi: bu yalnızca manage.py runserverDEBUG = 1 ile çalıştırırsanız çalışır . Canlı yayına geçtiğinizde, Django işlemi artık statik varlıklara hizmet etmeyecektir. Django'yu bunlara hizmet etmek için kullanmak verimsiz olacaktır, özellikle bunun için daha özel araçlar var.

Bunun yerine, şuna benzer bir şey yapmalısınız:

  • her uygulamadaki tüm statik dosyaları bulun
  • hepsini içeren tek bir dizin oluşturun
  • onları bir yere yükleyin ( staticweb sunucunuzda bir dizin veya üçüncü taraf bir dosya deposu)
  • web sunucunuzu (nginx gibi) /static/*doğrudan bu dizinden hizmet verecek ve diğer istekleri Django'ya yönlendirecek şekilde yapılandırın .

collectstatic bu dizini sizin için hazırlayan hazır bir komut dosyasıdır, böylece onu doğrudan dağıtım betiğinize bağlayabilirsiniz.


25

Üretim kurulumunda kalıcı URL'lere sahip olmak istiyorsunuz. Dosya içeriği değişmedikçe URL değişmez.

Bu, istemcilerin bilgisayarlarında Django'dan bir web sayfası açarken yanlış CSS veya JS dosyası sürümüne sahip olmalarını önlemek içindir. Django statik dosyaları, dosya değişikliklerini algılar ve URL'leri buna göre günceller, böylece CSS veya JS dosyası değişirse, web tarayıcısı yeni sürümü indirir.

Bu genellikle collectstaticçalışma sırasında dosya adına MD5 hash eklenerek elde edilir .

Düzenle: Birden çok uygulamaya ilişkin yanıta da bakın.


1
İyi bir! bilmiyordum
2016

"genellikle MD5 karması eklenerek elde edilir" ManifestStaticFilesStorage'ı mı kastediyorsunuz ? Güzel, bunu görmedim
Kos

3
Varsayılan olarak MD5 hashingi olmadığını düşünüyorum, çünkü settings.STATICFILES_STORAGEvarsayılan değerdir, bu StaticFilesStoragenedenle MD5 yalnızca siz onu ayarladıktan sonra başlayacaktır ManifestStaticFilesStorage, doğru muyum?
bakkal

@MikkoOhtamaa Peki o zaman ön uç uygulaması hangi dosya adına bağlanması gerektiğini nasıl bilir, çünkü ikincisi her zaman değişir?
lapin

@lapin Güzel soru! Doğal olarak, 1) en son sürümlerle eşleştirme ve 2) bunu iletmenin bir yolu olmalıdır. Genellikle bir yerde bir dosyada saklanır ve "X'in en son sürümü için hangi tam URL'yi" sorduğunuzda size bir sonuç verir.
Mikko Ohtamaa

10

Sitede birden fazla django uygulaması olduğunda kullanışlıdır.

collectstatic daha sonra tüm uygulamalardaki statik dosyaları tek bir yerde toplar - böylece bir üretim ortamında sunulabilir.

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.