2012-06-27 12 views
9

Mam ogólne pytanie dotyczące nowej struktury plików statycznych Django 1.3.Pliki statyczne django pod adresem url

Bardzo podoba mi się nowa funkcjonalność statycznego pliku Django wprowadzona w Django 1.3. Zazwyczaj ustawiam STATIC_URL = "/ static /" i wprowadzam tag szablonu {{STATIC_URL}} do moich szablonów. To wspaniałe, że serwer rozwoju automatycznie wyświetla pliki statyczne, a cała moja zawartość jest wyświetlana zgodnie z oczekiwaniami.

The {{ STATIC_URL }} would be substituted in the template and might serve up files like this... 
example.com/static/css/master.css 
example.com/static/images/logo.png 
example.com/static/js/site.js 

jednak pracuję w miejscu starszego, gdzie media statyczne jest zamontowany u nasady url. Na przykład, ścieżka do statycznych adresów URL może wyglądać następująco:

example.com/css/master.css 
example.com/images/logo.png 
example.com/js/site.js 

Nie używać „statyczny” nazw URL.

Zastanawiam się, czy istnieje sposób na uzyskanie nowej funkcji statycznych plików, aby nie używać statycznej przestrzeni nazw i podawać adresy URL powyżej, ale nadal zachowują zalety nowego statycznego frameworka (statyczne zbiory statyczne obsługiwane przez serwer programistyczny, itp). Próbowałem ustawić STATIC_URL = "" i STATIC_URL = "/", ale żaden z nich nie przyniósł pożądanego efektu.

Czy istnieje sposób skonfigurowania plików statycznych do wyświetlania plików statycznych bez przestrzeni nazw? Dzięki za uwagę.

Odpowiedz

4

Można ręcznie dodawać dodatkowe lokalizacje, które nie istnieją w static katalogów w ramach projektu:

urls.py

from django.conf import settings 
from django.conf.urls.static import static 

urlpatterns = patterns('', 
    # ... the rest of your URLconf goes here ... 
) 

if settings.DEBUG: 
    urlpatterns += static('/css/', document_root='app_root/path/to/css/') 
    urlpatterns += static('/images/', document_root='app_root/path/to/images/') 
    urlpatterns += static('/js/', document_root='app_root/path/to/js/') 

To będzie mapować media serwera DEBUG dev. A kiedy uruchamiasz serwer w trybie produkcyjnym, najwyraźniej będziesz obsługiwał te statyczne lokalizacje z serwera WWW zamiast wysyłać żądanie do django.

+0

Dzięki jdi. Czy w szablonach nadal powinienem {{STATIC_ROOT}} lub zostawić go jako/css /,/images /,/js/....? –

+0

Nie byłby już częścią aplikacji statycznej, ponieważ nie można go pobrać za pomocą 'python manage.py collectstatic'. Po prostu użyjesz zwykłych adresów URL: '/ css/foo.css'. Są one podawane bezpośrednio z poszczególnych lokalizacji. Mogą nawet istnieć poza obszarem projektu django. – jdi

+0

katalog_główny nie powinien rozpoczynać się od "/", musisz określić katalog główny projektu django, na przykład: 'urlpatterns + = static ('/ css /', katalog_główny_dokumentu = 'katalog_główny_aplikacji/ścieżka/do/css /') ' –

2

dlaczego nie zachować funkcjonalności plików statycznych i po prostu użyć przepisywania na poziomie serwera WWW do obsługi zawartości.

na przykład:

rewrite /css /static permanent; (for nginx) 

byłoby utrzymać katalog projektu wiele czystsze, a także łatwiej poruszać wokół statycznych katalogów w przyszłości, na przykład, aby przejść do STATIC_URL do CDN.

1

ten sposób można skonfigurować urls.py służyć zarówno index.html i inne swoje statycznych plików na/w Django 1.10 (a jednocześnie jest w stanie obsłużyć inne widoki Django):

from django.contrib.staticfiles.views import serve 
from django.views.generic import RedirectView 

urlpatterns = [ 

    #/routes to index.html 
    url(r'^$', serve, 
     kwargs={'path': 'index.html'}), 

    # static files (*.css, *.js, *.jpg etc.) served on/
    url(r'^(?!/static/.*)(?P<path>.*\..*)$', 
     RedirectView.as_view(url='/static/%(path)s')), 
] 

Zobacz this answer, gdzie napisałem pełniejsze wyjaśnienie takiej konfiguracji - szczególnie jeśli chcesz użyć jej do produkcji.