DEBUG = Yanlış ayar neden django Statik Dosya Erişimi'ni başarısız yapıyor?


356

Benim atölye olarak Django kullanarak bir uygulama inşa ediyorum. Hepsi şimdiye kadar iyi belirlenmiş - db ayarları, yapılandırılmış statik dizinler, URL'ler, görünümler vb. Ama kendi güzel ve özel 404.html ve 500.html sayfalarımı oluşturmak istediğim anda sorun sinsice başladı.

Özel hata işlemeyle ilgili dokümanları okudum ve UrlsConf'ta gerekli yapılandırmaları ayarladım, karşılık gelen görünümler oluşturdum ve 404.html ve 500.html'yi uygulamamın şablon dizinine ekledim (settings.py'de de belirtilir).

Ama dokümanlar diyor ki you can actually view custom error views until Debug is Off, bu yüzden eşyalarımı test etmek için kapattım ve o zaman işler çılgına döndü!

Sadece özel 404.html dosyasını görüntüleyemiyorum (aslında, yükler, ancak hata sayfalarımın her biri bir grafik hata mesajı içerdiğinden - bazı güzel görüntü olarak), hata sayfasının kaynağı yüklenir, ancak başka bir şey yüklenmez! Bağlantılı CSS veya Javascript bile yok!

Genel olarak, bir kez ayarladığımda DEBUG = False, tüm görünümler yüklenir, ancak herhangi bir bağlantılı içerik (CSS, Javascript, Görüntüler vb.) Yüklenmez! Ne oluyor? Statik dosyalar ve DEBUGayarlarla ilgili eksik bir şey var mı ?


Nasıl ev sahipliği yapıyorsunuz? Test sunuculu yerel makine?
j_syk

test sunucusu ile yerel makine. Temel olarak, mevcut olmayan sayfalara erişme ve çalışma zamanı hatalarına neden olma gibi senaryoları yerel olarak simüle ederek özel hata işlememin nasıl çalışacağını görmek istiyorum - ancak statik içeriğim yüklenmeyecek.
nemesisfixx

Burada olduğu gibi sunucu düzeyinde yapılabilir veya urlpattern eklenerek Django düzeyinde kullanılabilir. Bunu aynı sorun için aşağıdaki soruyu buldum. stackoverflow.com/questions/6405173/…
Pankaj Anand

Yanıtlar:


353

Hata ayıklama kapalıyken Django artık sizin için statik dosyaları işlemeyecektir - üretim web sunucunuz (Apache vb.) Bununla ilgilenmelidir.


3
Bu aslında benim merakımı çözüyor, bu yüzden şimdi mantıklı ve gerçekten de gerekirse Apache ile ilgilenebilirim. Kendi ayarlarımda bir sorun olduğunu düşünmüştüm. Teşekkürler
nemesisfixx

5
Bu cevabı çok faydalı buldum. Başka birinin aynı durumumda olması durumunda (nonrel django ile uygulama için Google App Engine'i kullanarak): app.yaml dosyasını güncellemeyi unutmayın.
Lyndsey Ferguson

3
işleyiciler: - url: / statik static_dir: statik
Lyndsey Ferguson

476

Hala statik olarak yerel olarak sunucuya ihtiyacınız varsa (örn. Hata ayıklama olmadan test etmek için) devserver'ı güvenli olmayan modda çalıştırabilirsiniz:

manage.py runserver --insecure

6
Bu bayrak çalışırken, collectstatic klasöründen içerik sunmaz
Howie

5
Bu sihir. Teşekkür ederim efendim, sen bir kahramansın. Bu cevap kabul edilen cevapla birleştirilmelidir, çünkü django'nun kendisinden başka bir yol kullanarak statik olarak hizmet etmek zorunda kalmadan problemi çözer.
Depado

1
Tüm ihtiyacım buydu. En iyi uygulama, geliştirme ve üretim ortamını ve Hata Ayıklama geçişini ayırt etmek için ortam değişkenini kullanmak olsa da.
Neeraj Gupta

1
Lütfen dikkat: ManifestStaticFilesStorage ile code.djangoproject.com/ticket/19295
Andrea Rabbaglietti

9
Birisi bana bu konuda bu kadar güvensiz olanı söyleyebilir
Kavi Vaidya

36

Üretimde statik dosyalar sunmak için WhiteNoise kullanabilirsiniz .

Yüklemek:

pip install WhiteNoise

Ve wsgi.py dosyanızı şu şekilde değiştirin :

from django.core.wsgi import get_wsgi_application
from whitenoise.django import DjangoWhiteNoise

application = get_wsgi_application()
application = DjangoWhiteNoise(application)

Ve gitmekte fayda var!

Kredi Gidon Yaratıcı Blog .

ANCAK, statik dosyaların üretimde bu şekilde sunulması gerçekten önerilmez. Üretim web sunucunuz (nginx gibi) bununla ilgilenmelidir.


1
Kulağa ilginç geliyor, ama sadece bu satırı wgsi.pydosyaya ekleyerek benim için çalışmadı . Bağladığınız belgelerin WhiteNoise kullanımı için başka talimatlar verdiği görülüyor. Başka yollar deneyecek ve sizi burada güncelleyecek.
DarkCygnus

+1, çünkü sonunda beni çözüme götüren şey buydu. Aslında işe yaraması için attığım ek adımları eklediğim bir cevap ekledim .
DarkCygnus

manage.py runserver --insecurebenim için çalışmadı. Bu da öyle.
Jee

3
WhiteNoise sürüm 4.0 ile yapılandırmanın değiştiğini unutmayın. Bu satırları wsgi.py'ye eklemeyin. Bunun yerine, 'whitenoise.middleware.WhiteNoiseMiddleware'ara katman yazılımına ekleyin . Bkz sürüm notlarını değişmek gelen
Doug Harris

* Neden önerilmez? Yıllardır birkaç sitede kullanıyorum, harika çalışıyor. Heroku bile bunu Django şablonlarında kullanıyor.
Omar Gonzalez

33

Urls.py'de bu satırı ekledim:

from django.views.static import serve 

bu iki url'yi urlpatterns'e ekleyin:

url(r'^media/(?P<path>.*)$', serve,{'document_root': settings.MEDIA_ROOT}), 
url(r'^static/(?P<path>.*)$', serve,{'document_root': settings.STATIC_ROOT}), 

ve DEBUG = FALSE olduğunda hem statik hem de medya dosyalarına erişilebilir.
Umarım yardımcı olur :)


HARİKA! STATIC_ROOT ve manage.py collectstatic öğelerini ayarlamayı unutmayın.
DomingoR

2
Günümüzde yerini url(ilere_path(
Leopd

19

Statik sunum görünümünü geliştirmede kullanıyorsanız, DEBUG = True:

Uyarı

Bu sadece DEBUG True olduğunda çalışır.

Çünkü bu görüş son derece verimsiz ve muhtemelen güvensizdir. Bu sadece yerel kalkınmaya yöneliktir ve asla üretimde kullanılmamalıdır.

Dokümanlar: geliştiricideki statik dosyaları sunma

DÜZENLEME: Sadece 404 ve 500 şablonlarınızı test etmek için bazı URL'ler ekleyebilirsiniz, sadece URL'lerinizdeki direct_to_template genel görünümünü kullanın.

from django.views.generic.simple import direct_to_template

urlpatterns = patterns('',
    ('^404testing/$', direct_to_template, {'template': '404.html'})
)

1
O zaman üretimdeki statik dosyaları nasıl sunar? NVM, bunu yeni gördüm. Teşekkürler.

web sunucunuzu belirli bir dizini barındıracak şekilde ayarlarsınız. En yaygın olarak Apache veya Nginx kullanırsınız. Dokümanlar biraz içine giriyor.
j_syk

teşekkürler @j_syk, zaten 404.html ve 500.html u önermek benzer başka bir hata olmayan mekanizma yoluyla görüntüleme bu yaklaşımı denedim. Ancak, yalnızca test sunucumda çalışırken, sayfalarımın üretildikleri gibi doğru bir şekilde oluşturulmasının tamamen imkansız olup olmadığını bilmek istedim - Debug Kapalı olduğunda statik dosya işleme heyeti benim için karar verdi. Katkınız için teşekkürler.
nemesisfixx

@mcnemesis Tam olarak ne olacağından emin değilim - ancak TEMPLATE_DEBUG = False ve DEBUG = True ayarını yapmayı deneyin. Güzel hataları kapatırsanız bunun yerine 404/500 şablonlarına gidip gitmediğinden emin değilim
j_syk

beklendiği gibi, bunu yapmak olumlu sonuçlar vermedi.
nemesisfixx

17

Johnny'nin cevabı harika, ama yine de sadece orada tarif edilen satırları ekleyerek benim için işe yaramadı. Bu cevaba dayanarak, benim için gerçekten işe yarayan adımlar nerede:

  1. WhiteNoise'ı tarif edildiği gibi kurun :

    pip install WhiteNoise
  2. Oluşturmak STATIC_ROOTdeğişken ve hiç WhitENoise eklemek MIDDLEWAREdeğişken settings.py:

    #settings.py
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'whitenoise.middleware.WhiteNoiseMiddleware', #add whitenoise
        'django.contrib.sessions.middleware.SessionMiddleware',
        ...
    ]
    
    #...
    
    STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') ##specify static root
  3. Ardından, wsgi.pydosyanızı Johnny'nin cevabında açıklandığı gibi değiştirin :

    #wsgi.py
    from django.core.wsgi import get_wsgi_application
    from whitenoise.django import DjangoWhiteNoise
    
    application = get_wsgi_application()
    application = DjangoWhiteNoise(application)
  4. Bundan sonra, değişikliklerinizi sunucunuza dağıtın (git veya ne kullanırsanız kullanın).

  5. Son olarak, sunucunuzdaki collectstaticseçeneği çalıştırın manage.py. Bu, statik klasörlerinizdeki tüm dosyaları daha STATIC_ROOTönce belirttiğimiz dizine kopyalar :

    $ python manage.py collectstatic

    Artık staticfilesbu tür öğeleri içeren yeni bir klasör göreceksiniz .

Bu adımları uyguladıktan sonra sunucunuzu çalıştırabilir ve Üretim modundayken statik dosyalarınızı görebilirsiniz.

Güncelleme: Sürüm vardı durumda <4 değişiklik günlüğü onu ilan etmek artık gerekli olduğunu gösterir WSGI_APPLICATION = 'projectName.wsgi.application'senin üzerine settings.pydosyaya.


Buna göre yaptım ve geliştirme sırasında iyi hizmet etti, ancak üretimde değil. DEBUG == Yanlış
Anna Huang

@AnnaHuang Geliştirme ve üretimde ne demek istiyorsun? Ayrı ortamlarınız veya makineleriniz var mı? Aynı şekilde yapılandırıldılar mı?
DarkCygnus

13

Bir üretim Django uygulamasında statik dosyaları güvenli ve güvenli bir şekilde sunabilirsiniz DEBUG=True .

Django'nun kendisini kullanmak yerine , WSGI dosyanızda dj_static kullanın ( github ) :

# requirements.txt:

...
dj-static==0.0.6


# YOURAPP/settings.py:

...
STATIC_ROOT = 'staticdir'
STATIC_URL = '/staticpath/'

# YOURAPP/wsgi.py:

...
from django.core.wsgi import get_wsgi_application
from dj_static import Cling

application = Cling(get_wsgi_application())

2
O zamandan beri daha tam özellikli olabilecek beyaz benliği keşfettim .
Robin Winslow

7

Sadece urls.py projenizi açın, sonra if ifadesini bulun.

if settings.DEBUG:
    urlpatterns += patterns(
        'django.views.static',
        (r'^media/(?P<path>.*)','serve',{'document_root': settings.MEDIA_ROOT}), )

Ayarları değiştirebilirsiniz. True üzerinde DEBUG ve her zaman çalışır. Ancak projeniz ciddi bir şeyse, yukarıda belirtilen diğer çözümleri düşünmelisiniz.

if True:
    urlpatterns += patterns(
        'django.views.static',
        (r'^media/(?P<path>.*)','serve',{'document_root': settings.MEDIA_ROOT}), )

Django 1.10'da şöyle yazabilirsiniz:

urlpatterns += [ url(r'^media/(?P<path>.*)$', serve, { 'document_root': settings.MEDIA_ROOT, }), url(r'^static/(?P<path>.*)$', serve, { 'document_root': settings.STATIC_ROOT }), ]

3
Kodunuz doğru, ancak Django 1.10'da yapılandırma medya içindir ve statiktir: urlpatterns + = [url (r '^ media / (? P <yol>. *) $', Sun, {'document_root': ayarlar .MEDIA_ROOT,}), url (r '^ statik / (? P <yol>. *) $', Sun, {'document_root': settings.STATIC_ROOT}),]
Roberth Solís

6

Bunu farklı şekillerde hata ayıklayabilirsiniz. İşte yaklaşımım.

localsettings.py:

DEBUG = False
DEBUG404 = True

urls.py:

from django.conf import settings
import os

if settings.DEBUG404:
    urlpatterns += patterns('',
        (r'^static/(?P<path>.*)$', 'django.views.static.serve',
         {'document_root': os.path.join(os.path.dirname(__file__), 'static')} ),
    )

Belgeleri okuduğunuzdan emin olun;)

https://docs.djangoproject.com/en/2.0/howto/static-files/#limiting-use-to-debug-true


1

Projemde / urls.py üzerinde aşağıdaki değişiklikleri yaptım ve benim için çalıştı

Bu satırı ekleyin: django.conf.urls import url adresinden

ve urlpatterns içinde: url (r '^ media / (? S. *) $', {'document_root': ayarlar.MEDIA_ROOT,}) 'u ekleyin.


0

Url () öğesine yönelik dize görünümü bağımsız değişkenleri desteği kullanımdan kaldırılmıştır ve Django 1.10 sürümünde kaldırılacaktır

Benim çözümüm yukarıdaki Conrado çözümü için küçük bir düzeltme.

from django.conf import settings
import os
from django.views.static import serve as staticserve

if settings.DEBUG404:
    urlpatterns += patterns('',
        (r'^static/(?P<path>.*)$', staticserve,
            {'document_root': os.path.join(os.path.dirname(__file__), 'static')} ),
        )

0

En güvenli olmasa da, kaynak kodunu değiştirebilirsiniz. şu yöne rotayı ayarlaPython/2.7/site-packages/django/conf/urls/static.py

Sonra aşağıdaki gibi düzenleyin:

if settings.DEBUG or (prefix and '://' in prefix):

Bu yüzden settings.debug==Falsekod üzerinde etkili olmazsa , çalıştırdıktan sonra da deneyinpython manage.py runserver --runserver statik dosyaları .

NOT : Bilgi yalnızca test için kullanılmalıdır


0

Bu tam olarak DEBUG = TRUE olmadan projenizi çalıştırmak için terminal yazmanız gerekir ve sonra tüm varlıklar (statik) dosya yerel sunucuya doğru yüklendiğini görüyorsunuz.

python manage.py runserver --insecure 

--insecure : sunucuyu güvenlik modu olmadan çalıştırabileceğiniz anlamına gelir


0

Marek Sapkota'nın cevabına katılıyorum; Ama yine de django URFConf'u kullanabilirsiniz statik dosya istenirse URL'yi yeniden tahsis etmek .

Adım 1: STATIC_ROOTsettings.py dosyasında bir yol tanımlayın

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

Adım 2: Ardından statik dosyaları toplayın

$ python manage.py collectstatic

Adım 3: Şimdi URLConf'nizi tanımlayın, eğer statik url'nin başlangıcındaysa, dosyalara statik klasörden erişin staticfiles. NOT: Bu, projenizin urls.py dosyasıdır:

from django.urls import re_path
from django.views.static import serve

urlpattern += [
  re_path(r'^static/(?:.*)$', serve, {'document_root': settings.STATIC_ROOT, })
]
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.