Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

./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",
    )
}

Ответ 2

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

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

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

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

Ответ 3

Мой конфиг:

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