2014-02-13 7 views
0

Я сделал автоматическое обновление (Debian правил, но иногда ногами ...) Джанго, и теперь я не могу попасть в админ части моего приложения ...Джанго 1.3-> 1.4.6 staticfiles

после входа в системе (правильно или нет), то отладка показывает

ImproperlyConfigured at /admin/ 
You're using the staticfiles app without having set the required STATIC_URL setting. 
Request Method: POST 
Request URL: http://django.zzzz.yy:83/wwwwwwww/admin/ 
Django Version: 1.4.5 
Exception Type: ImproperlyConfigured 
Exception Value:  
You're using the staticfiles app without having set the required STATIC_URL setting. 
Exception Location: /usr/lib/python2.7/dist-packages/django/contrib/staticfiles/utils.py in check_settings, line 49 
Python Executable: /usr/bin/python 
Python Version: 2.7.3 
Python Path:  
['/home', 
'/home/wwwwwwww', 
'/usr/lib/python2.7', 
'/usr/lib/python2.7/plat-linux2', 
'/usr/lib/python2.7/lib-tk', 
'/usr/lib/python2.7/lib-old', 
'/usr/lib/python2.7/lib-dynload', 
'/usr/local/lib/python2.7/dist-packages', 
'/usr/lib/python2.7/dist-packages', 
'/usr/lib/python2.7/dist-packages/PIL', 
'/usr/lib/pymodules/python2.7'] 

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

settings.py:

(...)

# Absolute path to the directory that holds media. 
# Example: "/home/media/media.lawrence.com/" 
MEDIA_ROOT = '/home/media/' 

# URL that handles the media served from MEDIA_ROOT. Make sure to use a 
# trailing slash if there is a path component (optional in other cases). 
# Examples: "http://media.lawrence.com", "http://example.com/media/" 
MEDIA_URL = '' 

# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a 
# trailing slash. 
# Examples: "http://foo.com/media/", "/media/". 
ADMIN_MEDIA_PREFIX = '/static/' 

STATIC_ROOT = "/var/www/static/" 
STATIC_URL = "/static/" 

# List of callables that know how to import templates from various sources. 
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader', 
    'django.template.loaders.app_directories.Loader', 
#  'django.template.loaders.eggs.Loader', 
) 

INSTALLED_APPS = (
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.sites', 
    'django.contrib.messages', 
    # Uncomment the next line to enable the admin: 
    'django.contrib.admin', 
    # Uncomment the next line to enable admin documentation: 
    'django.contrib.admindocs', 
    'django.contrib.staticfiles', 
    'accounts', 
) 

(...)

и Apache настройки:

Alias /admin_media/ /usr/share/pyshared/django/contrib/admin/media/ 

Когда я сделал приложение (на 1.3) Я создаю приложение из учебника, и не добавляйте каких-либо css или изображений -> просто чистое приложение - я использую admin для редактирования объектов (это очень ранняя версия - еще нет интерфейса - просто просмотры).

Мои приложения находятся в/дома:

/дома/app1 /дома/app2 /дома/app3

(эти приложения полностью независимы)

Насколько я понимаю, статические файлы являются общими для Джанго приложений (например, .css от администратора одинакова для всех приложений)

Итак вопросы:

  1. Где я должен вставлять общие файлы (и где они сейчас?
  2. Какие настройки следует изменить?
  3. , где я должен вставить CSS посвященный каждое приложение (в будущем, когда я выхожу очень развитие, и перейти к пререлизу; D
+0

Вы используете 1.4 только потому, что это версия Debian поставляется с? – fcoelho

+0

есть. самый высокий стабильный –

+0

Если у вас нет других ограничений, подумайте о разработке своего проекта в [virtualenv] (http://www.virtualenv.org/en/latest/). Вы сможете работать с последней версией Django, не изменяя всю свою системную версию – fcoelho

ответ

2

Я не буду отвечать на каждый вопрос по отдельности, но буду пытаться чтобы покрыть достаточно статических файлов, чтобы вы могли их правильно использовать.

Первое, что вы должны знать о том, какие статические файлы должны быть: CSS, Javascript, некоторые изображения, файлы, которые не будут меняться на основе пользовательские взаимодействия. С другой стороны, медиафайлы - это в основном загруженные пользователем файлы, которые будут меняться.

Приложение staticfiles предназначено для упрощения хранения статических файлов и нескольких мест, но их использование равномерно, а также для удобства их обслуживания во время разработки.

Где разместить статические файлы

Django использует параметр STATICFILES_FINDERS, чтобы определить, как найти статические файлы. По умолчанию включены два искателя: FileSystemFinder и AppDirectoriesFinder.Первый ищет файлы в папках, указанных в STATICFILES_DIRS, и довольно прост в использовании: добавьте каталог в этот параметр, поместите туда файл, и все будет готово.

Второй поиск, AppDirectoriesFinder, более интересен: для любых приложений, перечисленных в INSTALLED_APPS, он будет искать статические файлы внутри папки с именем static внутри каждого приложения. Итак, в вашем случае он будет искать статические файлы в /home/app{1,2,3}/static.

Вы можете разместить свои статические файлы везде, где хотите, до тех пор, пока вы каким-либо образом ссылаетесь на них. Если вы работаете с автономным приложением, вы хотите использовать стратегию папки static, поэтому вы можете легко распространять свое приложение и все связанные файлы в одном пакете, как это делает admin. Если вы работаете над приложениями, специфичными для вашего проекта, вы можете выбрать любой или оба. Идите за тем, что упрощает обслуживание и вызывает наименьшие неожиданности (старайтесь избегать «О, я был уверен, что этот файл должен был быть здесь, но он там вместо»).

Как реально использовать этот

Пуск, удалив параметр ADMIN_MEDIA_PREFIX, не осуждался в 1,4 и больше не используется в текущих версиях.

После того как вы ваши статические файлы где-то, вы можете написать, в шаблонах:

{% load staticfiles %} 
... 
<link rel="stylesheet" href="{% static "some-css-file.css" %}"> 

Это {% static %} тег переведут примерно в {{STATIC_URL}}/some-css-file.css, который использует все, что вы определяете, как STATIC_URL в настройках.

Обслуживание файлов

Когда вы используете сервер разработки (python manage.py runserver), Django будет автоматически обслуживать статические файлы из любого места они к вам. Это хорошо и все, но он не будет работать под Apache, если вы явно не сообщите Django об этом, даже если DEBUG - False. Но вы, вероятно, shouldn't to this (читайте «Предупреждение»).

Вместо этого вы должны использовать команду управления под названием collectstatic. Когда вы запустите эту команду, Django будет проходить через папку static для каждого приложения в INSTALLED_APPS и каждую папку в STATICFILES_DIRS и скопировать содержимое в STATIC_ROOT. После этого вам нужно добавить правило в Apache, которое сообщает, где находятся файлы. Это должно быть что-то вроде этого:

Alias STATIC_URL STATIC_ROOT 

Или, используя значения в файле настроек:

Alias /static/ /var/www/static/ 

Резюме

Теперь я буду отвечать только на вопросы:

  1. Это зависит от вас. Вы можете поместить их в отдельную папку (которую вы должны указать в STATICFILES_DIRS) или использовать приложение для этого (одно из них называется «веб-сайт», «общий» или что-то еще, вплоть до вас) и поместить их в папку static внутри;
  2. Из настроек, похоже, вы уже изменили то, что было необходимо (вы включили STATIC_URL).Не забудьте удалить ADMIN_MEDIA_PREFIX. Статические файлы администратора также будут скопированы, если вы используете collectstatic;
  3. Поместите их в static папку приложения и запустить collectstatic в производстве, чтобы скопировать их на место веб-сервер может увидеть
+0

Ну, я могу использовать оба искателя?/home/common form common/home/app {1,2,3}/static для статических объектов, предназначенных для каждого приложения? И как установить apache Alias ​​/ static/->/home/common? –

+0

Да, это работает - я еще не использовал collectstatic, но изменение настроек устраняет ошибку. –

+0

Вы можете использовать оба варианта, фактически это [включено по умолчанию] (https://docs.djangoproject.com/en/1.4/ref/contrib/staticfiles/#staticfiles-finders). В любом случае вам еще нужно вызвать '' collectstatic'' перед тем, как отправлять файлы. Обратите внимание, что вы не должны иметь STATIC_ROOT в любой папке, которая находится в STATICFILES_DIRS, поэтому, если у вас есть «общая» папка статических файлов (например, «/ home/common''), вы должны установить STATIC_ROOT в что-то еще (например, ''/home/static''). После этого используйте Apache '' Alias'' для обслуживания папки. Проверьте [это руководство] (http://bit.ly/1dYtkKS) – fcoelho

Смежные вопросы