Что я делаю не так со статическими файлами Django? - PullRequest
1 голос
/ 17 октября 2011

Я работаю над написанием приложения для Django впервые, так что потерпите меня, если я немного отстаю в вещах.

Вот выдержка из моих настроек.py:

STATIC_ROOT = os.getcwd().replace('\\','/') + '/static'

STATIC_URL = '/static_files/'

STATICFILES_DIRS = (
    os.getcwd().replace('\\','/') + '/static'
)

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)

Примечание: я надеюсь, что строка os.getcwd()... работает. Я уверен, что это не моя проблема, но, пожалуйста, дайте мне знать, если это проблема. Это местозаполнитель для локальных целей разработки, поэтому не беспокойтесь о том, что он останется там при развертывании.

Моя первая проблема заключается в том, что переменные шаблона, похоже, не работают.

Выдержка из моего основного файла шаблона:

<link rel="stylesheet" type="text/css" href="{{ STATIC_URL|default:'/static_files/' }}css/base.css" />

Изначально у меня там был {{ STATIC_URL }}, но он просто ничего не возвращал, поэтому я попытался добавить |default:'...'. Это успешно сгенерировало данную строку в результирующем HTML, но все равно не сработало, что подводит меня ко второму (и, что более важно, честно) вопросу.

Я не могу заставить работать статические файлы. Я попробовал несколько разных методов здесь. Я попытался поместить абсолютные и относительные пути (в различных комбинациях) в каждую из приведенных выше переменных STATIC_*, вместо этого я попытался использовать эквивалентные MEDIA_URL переменные, и я попытался вставить следующее в urls.py:

urlpatterns = ('',

    # ...

    (r'^static_files/(?P<path>.*)$', 
        'serve', {
            'document_root': '/path/to/django/dir/static_files/',
            'show_indexes': True 
        }
    ),
)

(я взял вышеупомянутый фрагмент из http://www.arthurkoziel.com/2008/09/02/handling-static-files-django/.)

Теперь я должен отметить, что я надеюсь, что со временем начну обслуживать статические файлы из параллельного процесса Apache, когда начальный dev будет завершен, но я все равно очень хотел бы знать, что я делаю неправильно. Мне не удалось найти достаточно всеобъемлющее руководство по статическим файлам в Интернете или по StackOverflow.

Вся помощь очень ценится.

РЕДАКТИРОВАТЬ: В случае, если это важно, я на Windows 7 использую Python 2.7.

1 Ответ

3 голосов
/ 17 октября 2011

Одна возможность - STATIC_URL не будет заполнено в ваших шаблонах, если вы не передадите RequestContext.

Убедитесь, что у вас есть что-то похожее на это:

return render_to_response(template, context, context_instance=RequestContext(request))

Начиная с Django 1.3, вы также можете использовать новый ярлык:

return render(request, template, context)

Кроме того, убедитесь, что у вас есть 'django.core.context_processors.static' в ваших контекстных процессорах.


РЕДАКТИРОВАТЬ: Возможный ответ на вторую проблему, попробуйте изменить

STATICFILES_DIRS = (
    os.getcwd().replace('\\','/') + '/static'
)

до

STATICFILES_DIRS = (
    os.getcwd().replace('\\','/') + '/static',
)

РЕДАКТИРОВАТЬ 2: Больше возможных исправлений

Вы можете удалить STATICFILES_FINDERS. У вас установлено только значение по умолчанию, поэтому, если вы не собираетесь расширять его позже, избавьтесь от него (еще одна вещь, которая может пойти не так).

Вы также можете избавиться от записи urlpatterns. Не обязательно.

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

Пример из типичного settings.py моего:

PROJECT_DIR = os.path.dirname(__file__)

STATIC_URL = '/static/'

STATICFILES_DIRS = (
    os.path.join(PROJECT_DIR, 'static'),
)

STATIC_ROOT = '/var/www/myproject_staticfiles/'

Вот и все!

Если вы хотите проверить, правильно ли Django находит и размещает ваши статические файлы, попробуйте запустить

python manage.py collectstatic

В моем случае это будет проходить через каталоги моего проекта, найти все статические файлы, а затем скопировать их в '/ var / www / myproject_staticfiles /', где я могу разместить их с помощью apache.

Сервер разработчика Django автоматически обслуживает статические файлы из папки вашего проекта, поэтому не требуется collect_static, находясь в dev. Вам даже не нужно устанавливать STATIC_ROOT, пока вы не приступите к работе.

...