2012-05-05 14 views
13

Jestem względnie nowy w Django (1.4) i ciężko jest mi zrozumieć filozofię związaną z plikami statycznymi, multimedialnymi i administracyjnymi. Struktura projektu różni się od jednego samouczka do drugiego, i to samo dla Webfaction (gdzie będę hostował moją aplikację). Chciałbym wiedzieć, jaki jest optymalny sposób zorganizowania go i przy jak najmniejszym bólu i edycji podczas wdrażania go do Webfaction, jaki jest sens statycznych mediów, adn plików administracyjnych? Z góry dziękujęZamęt w Django, plikach statycznych i multimedialnych

Odpowiedz

14

W gruncie rzeczy chcesz udostępniać pliki statyczne przez django w fazie rozwoju. Gdy będziesz gotowy do rozpoczęcia produkcji, serwer powinien zrobić to za Ciebie (są gotowe do zrobienia tego szybko :-))

Oto podstawowa konfiguracja, po zalogowaniu się na serwerze uruchamiasz polecenie collectstatic uzyskać wszystkie staticfiles w folderze static-korzeniowego, co twoje punkty Server do (patrz zasady przepisywania)

./manage.py collectstatic 

settings.py

from os import path 
    import socket 

    PROJECT_ROOT = path.dirname(path.abspath(__file__)) #gets directory settings is in 

    # Dynamic content is saved to here 
    MEDIA_ROOT = path.join(PROJECT_ROOT,'media') 
    # if ".webfaction.com" in socket.gethostname(): 
    # MEDIA_URL = 'http://(dev.)yourdomain.com/media/' 
    # else: 
     MEDIA_URL = '/media/' 

    # Static content is saved to here -- 
    STATIC_ROOT = path.join(PROJECT_ROOT,'static-root') # this folder is used to collect static files in production. not used in development 
    STATIC_URL = "/static/" 
    STATICFILES_DIRS = (
     ('', path.join(PROJECT_ROOT,'static')), #store site-specific media here. 
    ) 

    # List of finder classes that know how to find static files in 
    # various locations. 
    STATICFILES_FINDERS = (
     'django.contrib.staticfiles.finders.FileSystemFinder', 
     'django.contrib.staticfiles.finders.AppDirectoriesFinder', 
    # 'django.contrib.staticfiles.finders.DefaultStorageFinder', 
    ) 

settings_deployment.py

from settings import * 

DEBUG = False 
TEMPLATE_DEBUG = DEBUG 
MEDIA_URL = "http://yourdomain.com/media/" 

urls.py

...other url patterns... 

if settings.DEBUG: 
    urlpatterns += staticfiles_urlpatterns() #this serves static files and media files. 
    #in case media is not served correctly 
    urlpatterns += patterns('', 
     url(r'^media/(?P<path>.*)$', 'django.views.static.serve', { 
      'document_root': settings.MEDIA_ROOT, 
      }), 
    ) 

django.conf (lighttpd, to może być Apache lub nginx), ale wierzę webfaction posiada obsługę aplikacji na ustawianie to się łatwo

$HTTP["host"] =~ "(^|\.)yourdomain\.com$" { 
    fastcgi.server = (
     "/django.fcgi" => (
      "main" => (
       "socket" => env.HOME + "/project/project.sock", 
       "check-local" => "disable", 
      ) 
     ), 
    ) 
    alias.url = (
     "/media" => env.HOME + "/project/media", 
     "/static" => env.HOME + "/project/static-root", 
    ) 

    url.rewrite-once = (
     "^(/media.*)$" => "$1", 
     "^(/static.*)$" => "$1", 
     "^/favicon\.ico$" => "/static/img/favicon.png", 
     "^(/.*)$" => "/django.fcgi$1", 
    ) 
} 
+2

Warto zwrócić uwagę na to, że jeśli przypadkowo zapomnisz przecinka na końcu elementu STATICFILES_DIRS, program collectstatic zacznie kopiować wszystko zamiast tylko tego, co znajduje się w folderach statycznych. Zajęło mi to trochę czasu, więc pomyślałem, że o tym wspomnę. – Soviut

4

statyczne pliki są pliki wymagane przez aplikacje, które serwer może obsługiwać bez modyfikacji, takich jak niestandardowe skrypty JS, ikony, aplety itp. Najlepszym sposobem na ich wykorzystanie jest umieszczenie statycznych plików w "statycznym" folderze w każdym folderze aplikacji. W ten sposób serwer testowy znajdzie je tam, a jeśli wdrożysz na serwerze produkcyjnym, wystarczy uruchomić python manage.py collectstatic, aby skopiować je wszystkie w folderze głównym zdefiniowanym w pliku settings.py

Pliki multimedialne są te przesłane przez użytkowników twoich aplikacji, takie jak zdjęcia z awatara, itp.

Pliki administracyjne to pliki statyczne używane przez administratora Django, serwer testowy django je po prostu znajdzie, ale podczas produkcji musisz skopiować lub linkować ten folder, aby administrator mógł faktycznie działać.

Nadzieja to pomaga lepiej widzieć rzeczy ...

+0

Czy nie mogę po prostu utworzyć pojedynczego folderu, w którym umieszczam wszystkie kody css i javascript dla moich stron internetowych zamiast oddzielania ich w folderach?Mam na myśli, że układ strony jest gotowy, ale muszę tylko sprawić, żeby działał z Django. Czy powinienem oddzielić pliki? –

+0

Musisz umieścić pliki statyczne w osobnym katalogu niż kod Pythona lub szablony, ponieważ nie chcesz ujawniać swojego kodu, ale poza tym możesz je ułożyć tak, jak chcesz. Powinieneś przeczytać, że: https://docs.djangoproject.com/en/1.4/howto/static-files/ –

+0

przeczytaj, jak działają filefindery w dokumentach django, wszystko to jest dobrze wyjaśnione, na przykładzie zamieszczonym poniżej Powinien mieć sens, django będzie podążał za hierarchią, której używasz w kodzie do przeglądania plików i zbiera WSZYSTKIE te pliki do folderu głównego statycznego, ale w projekcie deweloperskim ma sens, aby czuć się odseparowanym od miejsca, w którym się znajdują. –

1

Mój config to:

1.settings.py

# Absolute filesystem path to the directory that will hold user-uploaded files. 
    # Example: "/var/www/example.com/media/" 
    MEDIA_ROOT='/media/' 

    # URL that handles the media served from MEDIA_ROOT. Make sure to use a 
    # trailing slash. 
    # Examples: "http://example.com/media/", "http://media.example.com/" 
    MEDIA_URL = '/media/' 

    # Absolute path to the directory static files should be collected to. 
    # Don't put anything in this directory yourself; store your static files 
    # in apps' "static/" subdirectories and in STATICFILES_DIRS. 
    # Example: "/var/www/example.com/static/" 
    STATIC_ROOT = '/static/' 

    # URL prefix for static files. 
    # Example: "http://example.com/static/", "http://static.example.com/" 
    STATIC_URL = '/static/' 


    # Additional locations of static files 
    STATICFILES_DIRS = (
     '/'.join(__file__.split(os.sep)[0:-2]+['static']), 
     # Put strings here, like "/home/html/static" or "C:/www/django/static". 
     # Always use forward slashes, even on Windows. 
     # Don't forget to use absolute paths, not relative paths. 
    ) 

    # List of finder classes that know how to find static files in 
    # various locations. 
    STATICFILES_FINDERS = (
     'django.contrib.staticfiles.finders.FileSystemFinder', 
     'django.contrib.staticfiles.finders.AppDirectoriesFinder', 
    # 'django.contrib.staticfiles.finders.DefaultStorageFinder', 
    ) 

2.urls.py

from django.conf import settings 
    if settings.DEBUG: 
     from django.contrib.staticfiles.urls import staticfiles_urlpatterns 
     urlpatterns += staticfiles_urlpatterns() 

I mój katalog strony jest taki:

root 
    │ manage.py 
    │ 
    ├─media 
    ├─my_django_py3 
    │ settings.py 
    │ urls.py 
    │ views.py 
    │ wsgi.py 
    │ __init__.py 
    │ 
    ├─static 
    │  9gq05.jpg 
    │  ajax.js 
    │  favicon.gif 
    │ 
    ├─templates 
    └─utils 
Powiązane problemy