2012-03-31 7 views
5

Django zaleca, że ​​jeśli mam używać tylko jednego serwera (Apache) do obsługi zarówno plików dynamicznych, jak i statycznych, wówczas I should serve static files using django.contrib.staticfiles.Jak obsługiwać statyczne pliki admina django.contrib.staticfiles w Django 1.4 (używając jednego serwera Apache)?

Więc w moim settings.py mam załadowany django.contrib.staticfiles do mojego INSTALLED_APPS i django.core.context_processors.static do mojego TEMPLATE_CONTEXT_PROCESSORS.

zauważyłem w szablonach administracyjnych, że linki do plików statycznych tak (z index.html):

{% load i18n admin_static %} 

{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/dashboard.css" %}" />{% endblock %} 

Ale patrząc na szablon admin_static, to po prostu otoki dla static:

from django.conf import settings 
from django.template import Library 

register = Library() 

if 'django.contrib.staticfiles' in settings.INSTALLED_APPS: 
    from django.contrib.staticfiles.templatetags.staticfiles import static 
else: 
    from django.templatetags.static import static 

static = register.simple_tag(static) 

Tak więc doszedłem do wniosku, że ponieważ każdy plik statyczny administratora ma serwer z prefiksem admin/..., pełna ścieżka (dla mojego przypadku) powinna być

/usr/lib64/python2.7/site-packages/django/contrib/admin/static 

Ustawiłem więc ścieżkę do mojego STATICFILES_DIRS wewnątrz settings.py, ale Apache nadal nie będzie obsługiwał żadnych plików statycznych (po restytucji serwera). Gdzie popełniłem błąd w mojej logice?

Odpowiedz

9

Dziękuję Danielowi Rosemanowi za wyjaśnienie i daje mi szansę nauczenia się tego na własną rękę (a teraz nie zapomnę!) :-).

Początkowo byłem bardzo zdezorientowany i nie wiedział, trzeba było najpierw zbierać pliki statyczne, a następnie powiedzieć Apache służyć niego. Pomyślałem, że po prostu użycie STATICFILES_DIRS i włączenie static aplikacji w settings.py było wystarczająco dobre.

Więc tutaj jest jak to zrobiłem (i proszę dać mi znać, czy mogę to zrobić lepiej):

W settings.py

STATIC_ROOT = '/var/www/localhost/htdocs/mysite/static/' 
STATIC_URL = '/static/' # default 

Wydaje Django już wiedzieć, gdzie gromadzić pliki administratora , nie musisz niczego określać w STATICFILES_DIRS, chyba że musisz podać własne pliki niestandardowe (których nie mam, a tym samym nie miałem wcześniejszego doświadczenia z plikami statycznymi w Django).

Następnie o /var/www/localhost/htdocs/mysite/ typ python manage.py collectstatic -l. -l oznacza utworzenie dowiązania symbolicznego do wszystkich znalezionych plików statycznych zamiast ich kopiowania (oszczędność miejsca).

Następnie edytuj plik konfiguracyjny Apache (zwykle httpd.conf) i dodaj informacje o STATIC_URL.Mój plik konfiguracyjny dla Django wygląda następująco:

Alias /static/ /var/www/localhost/htdocs/mysite/static/ 
#In the form of... 
#Alias STATIC_URL STATIC_ROOT 

<Directory /var/www/localhost/htdocs/mysite/static> 
    Order deny,allow 
    Allow from all 
</Directory> 

WSGIScriptAlias//var/www/localhost/htdocs/mysite/mysite/wsgi.py 
WSGIPythonPath /var/www/localhost/htdocs/mysite 

<Directory /var/www/localhost/htdocs/mysite/mysite> 
    <Files wsgi.py> 
     Order deny,allow 
     Allow from all 
    </Files> 
</Directory> 

Następnie uruchom ponownie Apache i gotowe!

+0

Zwięzłe, głębokie i kompleksowe, dzięki) –

3

Dokumentacja, do której prowadzi łącze, nie mówi nic o plikach obsługujących pliki za pomocą aplikacji pliki statyczne. To nie jest to, do czego służy: służy do gromadzenia plików statycznych w jednym miejscu, aby umożliwić łatwe obsługiwanie ich przez Apache. (Zajmuje się tworzeniem plików obsługujących, ale nie o tym tutaj mówimy.)

Nadal musisz ustawić Apache, aby wyświetlał pliki z odpowiedniej lokalizacji za pomocą statycznego/prefixu.

+0

Mam Apache już skonfigurowane do wdrożenia Django z 'mod_wsgi' i użyciem' wsgi.py', który jest zawarty w Django 1.4. Postępowałem zgodnie z [sugestią dotyczącą dokumentacji] (https://docs.djangoproject.com/en/1.4/howto/deployment/wsgi/modwsgi/). – hobbes3

+0

Tak? Nadal musisz go skonfigurować, aby wyświetlał pliki statyczne, zgodnie z opisem w dalszej części tej strony. –

+0

Potem jestem zdezorientowany. Czy muszę przejść do '/ var/www/localhost/htdocs /' i stworzyć 'statyczne' symboliczne łącze do'/usr/lib64/python2.7/site-packages/django/contrib/admin/static' lub coś innego ? – hobbes3

Powiązane problemy