Вопрос по – Путаница в админке Django, статических и медиа файлах

13

Я относительно новичок в Django (1.4), и мне трудно понять философию статических, мультимедийных и административных файлов. Структура проекта отличается от одного учебника к другому и то же самое для Webfaction (где я буду размещать свое приложение). Я хотел бы знать, каков оптимальный способ его организации и с минимальными затратами труда и редактирования при развертывании его в Webfaction, в чем смысл статических носителей и файлов администратора? заранее спасибо

Ваш Ответ

3   ответа
14

вы хотите обслуживать статические файлы django в разработке. Когда вы будете готовы начать работу, вы хотите, чтобы сервер сделал это за вас (они созданы для того, чтобы делать это быстро :-))

Вот базовая настройка: после входа на сервер вы запускаете команду collectstatic, чтобы получить все статические файлы в папке static-root, на которую указывает ваш сервер (см. Правила перезаписи)

./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, это может быть apache или nginx), но я считаю, что у webfaction есть сервис приложений, который легко это настраивает

$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",
    )
}
Стоит отметить, что если вы случайно забудете запятую в элементе STATICFILES_DIRS, collectstatic начнет копировать все, а не только то, что находится в статических папках. Мне потребовалось некоторое время, чтобы заметить, поэтому я подумал, что упомяну это.
1

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()

И мой сайт dir выглядит так:

    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
4

необходимые вашим приложениям, которые сервер может обслуживать без изменений, такие как пользовательские сценарии JS, значки, апплеты и т. Д. Лучший способ использовать их - поместить статические файлы в «статический». папку в каждой папке вашего приложения. Таким образом, тестовый сервер найдет их там, и если вы развернете на производственном сервере, вам просто нужно будет запуститьpython manage.py collectstatic скопировать их все в корневую статическую папку, определенную в вашем settings.py

Мультимедийные файлы - это файлы, загруженные пользователями ваших приложений, такие как фотографии аватара и т. Д.

Административные файлы - это статические файлы, используемые администратором Django, тестовый сервер django просто найдет их, но в процессе работы вам придется скопировать или связать эту папку, чтобы администратор действительно работал.

Надеюсь, это поможет вам увидеть вещи лучше ...

Могу ли я просто создать одну папку, в которую я помещаю весь код CSS и JavaScript для своих веб-страниц вместо того, чтобы разделять их по папкам? Я имею в виду, у меня есть готовый макет сайта, но мне просто нужно, чтобы он работал с Django. Должен ли я отделить файлы? Mohamed Turki
прочитайте, как работают файловые определители в django docs, все это хорошо объяснено там, с примером, который я разместил ниже, это имеет смысл, django будет следовать иерархии, которую вы используете в кортеже файлового поискового файла, и собирать ВСЕ эти файлы в папку static-root , но в проекте dev имеет смысл держать чувства отделенными от того, где они принадлежат ..
Вы должны поместить статические файлы в отдельный каталог, чем код Python или шаблоны, потому что вы не хотите показывать свой код, но вы можете расположить их так, как вы хотите. Вы должны прочитать это:docs.djangoproject.com/en/1.4/howto/static-files

Похожие вопросы