Узреваем красоту Django. Part 2

28 Липня 2009

Узреваем красоту Django. Part 2

Вторая часть туториала о Django, где опять буду расказывать как создается полнофункциональный сайт. Это не подробнейшее руководство - за этим смотрите документацию на djangoproject.com и читайте книгу djangobook.com (на русском — djbook.ru). Это всего лишь практический туториал. И сегодня расскажу о:
  • статические файлы
  • статические страницы — flatpages
  • шаблоны
  • google_analytics
  • debug_toolbar

Cтатические файлы

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

# это у нас уже было
from django.conf.urls.defaults import *

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    (r'^contact/$', 'press_contact.views.contact' ),
    #(r'^login/', include('press_auth.urls') ),
    (r'^admin/', include(admin.site.urls) ),
)
# это мы добавляем
from django.conf import settings
if settings.DEBUG:
    urlpatterns += patterns('',
        (r'^robots.txt$', 'django.views.static.serve',
            {'document_root': settings.MEDIA_ROOT, 'path': "robots.txt"}),
        (r'^favicon.ico$', 'django.views.static.serve',
            {'document_root': settings.MEDIA_ROOT, 'path': "favicon.ico"}),
        (r'^media/(?P.*)$', 'django.views.static.serve',
            {'document_root': settings.MEDIA_ROOT}),
    )

В нашем добавленом коде сначала импортируем настройки, а потом смотрим если режим отладки то используем несколько стандартных views, незнаю как правильно их называть, но по сути views это функция которая обрабатывает запрос и отдает пользователю страницу. Создавать их будем в 3-ем уроке. Итак в наших urlpatterns мы указываем регулярное выражение с которым будет сравниваться URL, дальше функция что должна этот запрос обработать и дополнительные параметры. Подробнее о функции django.views.static.serve и ее параметрах на http://docs.djangoproject.com/en/dev/howto/static-files/. Мы же добавили три паттерна, первые два на обработку файлов robots.txt и favicon.ico, а третий уже на обработку всех остальных. Теперь если запустить сервер, то можна посмотреть медиа файлы.

Статические страницы — flatpages

Чаще всего сайту необходимы статические страницы — типа «О сайте», «Правила» и другие. Их проще всего создавать используя стандартную application Django - flatpages. Для ее подключения нужно добавить в файле settings.py строчки:

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware', #эту строчку добавляем
)

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.admin',
    'django.contrib.flatpages', #эту строчку добавляем
)

Установим application командой:
    manage.py syncdb
Если мы перейдем сейчас в админку http://127.0.0.1/admin/, то там увидим раздел Flatpages где можно создавать статические страницы в удобном интерфейсе. Нажмем на Add flat pages и увидим форму с 4 полями. В первом указываем URL странички, пусть будет для примера /about/, во втором поле указываем заголовок — О сайте, а в третьем сам текст странички. Дальше нужно указать к какому сайту будет принадлежать страница, а поскольку у нас один сайт то со списка выбираем gread.org.ua, и можна нажимать на Save. Теперь перейдем на страницу 127.0.0.1/about/ и увидим ошибку что шаблон flatpages/default.html не найдем. Исправимся… Создадим в папке проекта templates папку flatpages, а в ней файл default.html, который возьмем с официальной документации — http://docs.djangoproject.com/en/dev/ref/contrib/flatpages/ :
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
   "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head>
<title>{{ flatpage.title }}</title>
</head>
<body>
{{ flatpage.content }}
</body>
</html>

Как видим шаблон представляет собою обычный html-файл в который в нужных местах вставляются переменные между тегами {{ }}. Переменные могут быть разными, в даном случае это обьект записи базы данных. И мы через точку обращаемся к полям. Тоесть, flatpages это переменная записи с базы данных, а title и content поля в ней.

Шаблоны

Кроме переменных в шаблонах можна размещать теги между {% %}, можна использовать как стандарные теги, так и свои. Начнем со стандартных.
Для каждого шаблона создавать свое отображение не очень хорошо, поэтому давайте напишем общий шаблон base.html в каталоге templates, что может выглядеть так:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
        <title>GRead</title>
        <link rel="icon" type="image/x-icon" href="{{ MEDIA_URL }}favicon.ico" />
        <link rel="stylesheet" href="{{ MEDIA_URL }}css/screen.css" type="text/css" media="screen, projection" />
        <script type="text/javascript" src="{{ MEDIA_URL }}js/script.js"></script>
</head>

<body>
<div class="page">
    <h1>{% block title %}{% endblock %}</h1>
    <span>{% block content %}{% endblock %}</span>
</div>
</body>
</html>

В нем видим уже извесные нам переменные {{ MEDIA_URL }} которые добавляются автоматически с конфига, в нашем случае это будет /media/. Также видим первый для нас тег block {% block title %}{% endblock %} - сначала идет название тега block, а потом параметр title — название самого блока. Теперь мы можем создать новый шаблон, который будет наследовать базовый и в нем  переопределять блоки. Тоесть если в шаблоне встретяться блоки с названием title или content то их содержание измениться в базовом шаблоне на новое. К примеру теперь наш шаблон отображение flatpages может выглядеть так:

{% extends 'base.html' %}

{% block title %}
    {{ flatpage.title }}
{% endblock %}

{% block content %} {{ flatpage.content }} {% endblock %}

В нем мы сначала используем тег extends которым говорим что этот шаблон расширяет базовый шаблон 'base.html' и при этом нужно вместо существующих блоков в базовом шаблоне встроить новые значения, в которых мы помещаем переменные flatpage.title в блок title, и flatpage.content в content. Все очень логично и красиво!

google_analytics

Мы сейчас научились работать со стандартным application, но есть же много сторонних. К примеру разберем как добавить application google_analytics, что находится на страничке http://code.google.com/p/django-google-analytics/. Для его установки после скачивания поместим его в каталог нашего проекта, а дальше по инструции в файл settings.py добавим в INSTALLED_APPS строку google_analytics. Теперь посмотрим на пример использования и изменим наш файл base.html:

{% load analytics %}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
много-много текста
<body>
{% analytics "UA-7097802-2" %}
</body>

</html>

Как видим для использования пользовательских тегов их нужно загрузить тегом load — {% load analytics %}. А дальше можна его использовать: {% analytics «UA-7097802–2» %} — указав сначала имя тега, а потом параметры.

debug_toolbar

Еще одним application, которого я вставляю в каждый проект есть debug_toolbar, что очень сильно помагает при отладке. Этого application'a много модификаций, но большинство глючные, но в одной пока что багов е заметил это от xdissent. И исходники можна скачать на страничке http://github.com/xdissent/django-debug-toolbar/tree/master. Установка тоже простая, после скачивания и копирования в каталог проекта изменим файл settings.py:

MIDDLEWARE_CLASSES = (
    'debug_toolbar.middleware.DebugToolbarMiddleware',
    #...    
)

DEBUG_TOOLBAR_CONFIG = {
    'INTERCEPT_REDIRECTS' : False,
}

INSTALLED_APPS = (
    #...
    'debug_toolbar',
)

Очень хорошое описание debug_toolbar было когда-то опубликовано на Хабре — http://habrahabr.ru/blogs/django/50221/

------------

На этом завершим эту часть статьи. Исходники находятся на http://github.com/presidentua/gread/tree/master. Что бы все посмотреть нужно их скачать, дальше установить manage.py syncdb и запустить manage.py runserver 80. Но я же советую проделать все самим — это не займет много времени.

В следующей части мы перейдем к созданию своих application и напишем свой тег для шаблонной системы.

Пока;)
PS: я постоянно application называю application, хотя в русскоязыной литературе его переводят как модуль, но я как-то уже привык называть это апликейшн.

Содержание:
Часть 1 - http://tutamc.com/node/183
Часть 2 - http://tutamc.com/node/186
Часть 3 - http://tutamc.com/node/194
Часть 4 - http://tutamc.com/node/199

 
 
 
Роман Хоменко aka PresidentUA
mail/jabber: spirt40@gmail.com