Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Веб-разработка и фреймворки > Не удается подключить css


Автор: Anark1 1.7.2011, 20:20
Здравствуйте,
не так давно начал разбираться с Django и сразу же начал сталкиваться с разного рода проблемами. Задача - подключить css.
Делал все как тут (Basic usage):
https://docs.djangoproject.com/en/dev/howto/static-files/
То есть, моя последовательность действий:
В моем приложении создал папку static, в ней папку css, там файл style.css. django.contrib.staticfiles подключено. Затем пишу такой код: 
Код

<link rel="stylesheet" href="{{ STATIC_URL }}css/style.css" type="text/css" />

и css не подключается. Никаких дополнительных манипуляций с параметрами я не делаю, потому как если я правильно понял, то все в моем случае дефолтно.
Далее я не очень понимая смысла параметров STATIC_ROOT и STATIC_URL, сделал директорию static в корне проекта, прописал STATIC_ROOT, STATIC_URL, сделал collectstatic, все скопировалось чудесно. Но результата опять никакого, более того в конечном html коде вообще никаких изменений, то есть css/style.css и все. 
Еще не очень понятно, видел где-то в примерах, что и для css нужно прописывать маршрутизацию, но в джанго мануале этого нет.
Подскажите пожалуйста в чем я не прав и заодно буду признателен за разъяснения насчет смысла маршрутизации в данном случае, а также смысл collectstatic.

Автор: Anark1 1.7.2011, 21:08
Запилил явно через маршрутизацию. Хочется узнать можно ли иначе, а то как то это слишком, так подключать CSS.

Автор: Stolzen 2.7.2011, 01:08
В настройках добавляете путь к вашим static файлам
Код

MEDIA_ROOT = os.path.join(SITE_ROOT, "static")


И затем путь до таких фалов в urlconf, чтобы правильно диспатчер отпрабатывал запросы к статике:
Код

from settings import PRODUCTION, MEDIA_ROOT

if not PRODUCTION:   
    urlpatterns += patterns('',
        (r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': MEDIA_ROOT}),
    )    


Флаг PRODUCTION нужен для индикации, находится ли сервер под управлением тестового веб-сервера или уже под apache/чем-нибудь-другим - ведь в production серверах есть возможность явно указывать путь к static файлам в конфигах.

Автор: Anark1 2.7.2011, 12:51
Stolzen,
спасибо. А можно уточнить смысл маршрутизации в данном случае. Если я захочу хранить свои статик файлы в нескольких подпапках. Например css и js.
То есть можно добавить еще один маршрут, но это не совсем то. Если я правильно понимаю, то в данном случае все файлы должны храниться в одной папке.
И еще ряд вопросов.
1. А можно раскидать статик файлы по разным папкам, прописать STATICFILES_DIRS, потом сделать collectstatic в одну папку и указать до нее путь, как Вы написали?
2. Интересуют комментарии по примеру с мануала джанго (ссылка в первом посте), там используется STATIC_URL. То есть как вообще вся эта схема работает, есть ли иные механизмы, как использовать STATIC_ROOT, STATIC_URL. 
3. Я пока не очень сильно проникся джанго, не понимаю смысла скажем STATIC_ROOT и STATIC_URL, если последний принимает не кортеж, а лишь строку, почему нельзя сразу все вбить в STATIC_ROOT.
Заранее спасибо.

Автор: Stolzen 2.7.2011, 13:19
Да, по-хорошему они должны хранится в одной. (И при необходимости можно добавить еще один маршрут)

Цитата(Anark1 @  2.7.2011,  13:51 Найти цитируемый пост)
1. А можно раскидать статик файлы по разным папкам, прописать STATICFILES_DIRS, потом сделать collectstatic в одну папку и указать до нее путь, как Вы написали?

Можно попробовать из разных папок статические файлы запамить по одному адресу. Примерно вот так
Код

STATICFILES_DIRS = ['dir_a', 'dir_b', 'dir_c']
SERVER_STATIC_DIR = 'static'

# подготавливаем параметры
def prepare(args, path):
    # шаблон, по которому строится путь
    tplt = r'^%s/(?<path>.*)$' % path
    # класс, раздающий статику
    serve = 'django.views.static.serve'
    return [(tplt, serve, {'document_root': el}) for el in args]

# здесь теперь хранятся параметры, которые можно передавать в patterns
params = prepare(STATICFILES_DIRS)

# теперь передаем их
static_patterns = patterns('', *params)

# и добавляем к urlpatterns приложения
urlpatterns += static_patterns

Правда нужно проверить, будет ли работать. 

Или вы физически файлы хотите перенести в одну папку? 

Цитата(Anark1 @  2.7.2011,  13:51 Найти цитируемый пост)
2. Интересуют комментарии по примеру с мануала джанго (ссылка в первом посте), там используется STATIC_URL. То есть как вообще вся эта схема работает, есть ли иные механизмы, как использовать STATIC_ROOT, STATIC_URL. 

Честно говоря, затрудняюсь дать какие-либо комментарии по мануалу. Помню как-то давно пытался по нему делать, но у меня не заработало, я с тех пор со статикой дело имею только так, как я написал. 


Автор: Anark1 2.7.2011, 15:00
Спасибо! Будем посмотреть.

Автор: Anark1 2.7.2011, 15:57
Если интересно, такая тема. Прочитал в мануале (не понял почему ну да ладно), для того чтобы {{ STATIC_URL }} заработал, нужно обязательно передавать из представления в функцию render_to_response третьим параметром context_instance=RequestContext(request). Соответственно ставим STATIC_URL где лежат все статик файлы и можно подпапки и тогда происходит подстановка. Но все равно нужно прописывать маршрутизацию руками. Даже так.
Прочитал у одного человека
Цитата

В любом проекте есть статические файлы(css, js, image и другие). На продакшин сервере мы их будем раздавать через Nginx, но при самой разработке ставить nginx для таких целей как-то не красиво, поэтому будем их раздавать через Django.

Для меня не очень понятно, что это значит. То есть подразумевается на продакшн "в обход джанго", имеется ли ввиду какой-то хардкод или что.

Автор: Stolzen 2.7.2011, 22:30
Цитата(Anark1 @  2.7.2011,  16:57 Найти цитируемый пост)
Для меня не очень понятно, что это значит. То есть подразумевается на продакшн "в обход джанго", имеется ли ввиду какой-то хардкод или что. 

Да, именно - если развертывать программу на боевом сервере, то лучше статику раздавать через сервер напрямую, а не отправлять запрос за статикой в джанго - намного быстрее страницы в таком случае загружаются. Как пример кусочка конфига для апача:
Код

<VirtualHost *:80>
    Alias /static/ /path/to/static/
    WSGIScriptAlias / /path/project.wsgi 
</VirtualHost>

Сначала биндится статика, потом уже сам скрипт.

Вообще часто советуют для раздачи статики использовать дополнительный сервер, типа nginx, лично пока не практиковал такого.

Автор: damask 3.8.2011, 16:48
Вот небольшой мануал, который мне помог подключить статические файлы http://technovzor.com/webdev3805

Автор: gomer999999999 3.2.2013, 23:54
Добрый день.
Предлагаем к рассмотрению и тестированию наш проект - Маркетер Плагин.
Продвигаем его успешно во всем мире. Но только 27 января 2013 предоставили в Рунете к тестированию русифицированный плагин с русифицированным интерфейсом. Вся подробная информация наhttp://www.marketerplugin.ru/ 
Предлагаем протестировать наш плагин на только что русифицированном интерфейсеhttp://www.marketerplugin.ru/test_plagina.
В двух словах: плагин предназначен для создания сайтов-визиток и страниц продаж.
Ждем ваших комментариев, отзывов и критики.
Так же будем рады видеть вас на наших страницах в соц сетях
http://www.facebook.com/pages/Marketer-plugin/5288148..
http://vk.com/club46912629
Успехов и новых впечатлений.
С уважением, Богдан

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)