Django i pliki statyczne

Dość częstym problemem, zgłaszanym przez początkujących (lub zmęczonych) programistów Django, jest sposób konfiguracji mediów. Mediów czyli plików statycznych takich jak na przykład: kod JavaScript (.js), arkusze stylów (.css) czy grafiki (.png, .jpeg itp.). W tym wpisie wyjaśnie kilka podstawowych kwestii z tym związanych.

Konfiguracja statyki w Django opiera się na trzech wpisach w pliku settings.py. Są to definicje zmiennych: MEDIA_URL, MEDIA_ROOT i ADMIN_MEDIA_PREFIX.

Wykorzystanie MEDIA_URL

MEDIA_URL - adres URL, pod którym dostępne będą nasze pliki statyczne. Jest on wykorzystywany przy generowaniu adresów obrazków, arkuszy stylów itp.

Przykładowe ustawienia:

  • wartość domyślna: ''
  • serwer deweloperski: MEDIA_URL='/static/
  • serwer produkcyjny: MEDIA_URL='http://static.restlessbeing.pl/media/

Przyjmijmy, że chcemy włączyć jakiś arkusz stylów do naszej strony html. W Django zrobimy to wpisując do szablonu strony:

<link rel="stylesheet" type="text/css" href="{{ MEDIA_URL }}css/960/960.css" />

Jeśli ustawiliśmy MEDIA_URL na wartość: http://static.restless.being.pl/media/ to w kodzie naszej strony znajdzie się adres w postaci: http://static.restless.being.pl/media/css/960/960.css. Proste, prawda?

Dociekliwy jednak zapyta - jak to się stało, że zmienna MEDIA_URL nagle pojawia się w szablonie? Odpowiedzią na to pytanie jest context processor django.core.context_processors.media, który umieszcza w kontekście szablonu tę zmienną, a który mamy domyślnie włączony. Oto jego kod:

def media(request):
     """
    Adds media-related context variables to the context.
    """
    return {'MEDIA_URL': settings.MEDIA_URL}

Podsumowując: MEDIA_URL odpowiada za adres, pod którym przeglądarka będzie szukała plików statycznych. Pozostaje więc tylko powiedzieć o tym naszemu serwerowi.

Konfiguracja statyki na serwerze deweloperskim

W przypadku serwera developerskiego mozemy serwować statykę korzystając z wbudowanego widoku django.views.static.serve. W tym celu wpisujemy w urls.py:

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

Oznacza to tyle, że jeśli mamy:

  • MEDIA_URL='/static/',
  • document_root ustawiony na '/var/www/projekt1/site_media/`,

a w przeglądarce podamy adres: http://localhost:8000/static/css/960/960.css to w systemie plików szukany będzie plik: /var/www/projekt1/site_media/css/960/960.css.

Konfiguracja statyki na serwerze produkcyjnym

W przypadku serwera produkcyjnego, na przykład Apache czy Nginx, musimy go tak skonfigurować aby pod adresem wpisanym w MEDIA_URL (np. http://static.restlessbeing.pl/media/) dostępne były nasze pliki statyczne.

Wykorzystanie ADMIN_MEDIA_PREFIX

ADMIN_MEDIA_PREFIX - adres URL, pod którym dostępne będą pliki statyczne dla Panelu Administracyjnego Django. Jest to właściwie odpowiednik MEDIA_URL, tyle, że wykorzystywany w kontekście Panelu Administracyjnego.

Przykładowe ustawienia: - wartość domyślna: '/media/' - serwer deweloperski: '/media/' - serwer produkcyjny: ADMIN_MEDIA_PREFIX='http://static.restlessbeing.pl/admin/

W przypadku serwera deweloperskiego serwowanie statyki dla Panelu Administracyjnego działa samo z siebie. Natomiast, aby statyka dla Panelu Administracyjnego była prawidłowo serwowana na serwerze innym niż deweloperski, musimy zmapować adres podany w ADMIN_MEDIA_PREFIX na folder w systemie plików, analogicznie jak w przypadku MEDIA_URL. Pliki statyczne Panelu Administracyjnego znajdują się w katalogu: django/contrib/admin/media.

Wykorzystanie MEDIA_ROOT

MEDIA_ROOT - ścieżka w systemie plików, w której znajdują się pliki ze statycznymi danymi. MEDIA_ROOT wskazuje folder, do którego będą trafiały pliki wrzucane przez użytkowników, a to dlatego, że stanowi bazową ścieżkę dla parametru 'upload_to' pól FileField i ImageField.

Przykładowe ustawienia:

  • MEDIA_ROOT=/var/www/projekt1/site_media/

Warto pamiętać, że bardzo często w aplikacjach MEDIA_ROOT jest wykorzystywany jako domyślna lokalizacja nie tylko dla plików wrzucanych przez użytkowników ale i dla całej statyki. W ten sposób korzysta z tej zmiennej na przykład django-compress.


Pingbacks

2010-12-11 at 12:48 from http://rafalbilyj.pl/?p=88

Dodaj swój komentarz






Szczegóły wpisu

Opublikowany: 2009-06-22 o 22:36