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:
    MEDIA_URL=''
  • 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 pojawiła 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.*)", "static.serve", {
            "document_root": '/katalog/ze/statyka/',
        })
    )

Oznacza to tyle, że jeśli mamy:

MEDIA_URL='/static/'
# oraz
document_root = '/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:
    ADMIN_MEDIA_PREFIX='/media/'
  • serwer deweloperski:
    ADMIN_MEDIA_PREFIX='/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.

22. June 2009 by restless_being
Categories: Uncategorized | Tags: , , | 2 comments

Comments (2)

  1. Pingback: Pliki statyczne w Django « Zapiski samozwańczego programisty

  2. Wielkie dzięki za te informacje, w końcu krótko i zwięźle opisane.

    Pozdrawiam

Leave a Reply

Required fields are marked *