Содержание
Перевод © Попов Руслан <ruslan.popov • gmail>
В предыдущей главе мы объяснили как настроить проект и запустить сервер разработки. В этой главе вы изучите основы создания динамических страниц с помощью Django.
В качестве вашего первого задания, давайте создадим страницу, которая будет выводить знаменитое сообщение: «Здравствуй, Мир».
Если бы вы создавали обычную страницу с текстом
«Здравствуй, Мир» без использования Django, то
достаточно было бы создать файл с таким текстом, дать ему имя
hello.html
и загрузить в каталог на веб
сервере. Следует отметить, что в этом случае, вы определяете два
ключевых параметра страницы: её содержимое (строка
«Здравствуй, Мир») и её URL (http://www.example.com/hello.html).
Используя Django, вы указываете те же самые параметры, но другим способом. Содержимое страницы создаётся с помощью функции представления, а URL определяется в файле привязок URL. Сначала давайте напишем нашу функцию представления.
Внутри каталога mysite
, который был
создан с помощью команды django-admin.py startproject в предыдущей главе, создайте пустой
файл с именем views.py
. Этот файл будет содержать представления, описываемые в данной главе. Следует отметить, что нет ничего особенного в выбранном нами имени файла. Django нет никакой разницы как он называется и вы убедитесь в этом сами. Но, назвать так файл — это
хорошая идея, другим разработчикам будет проще ориентироваться
в вашем коде.
Наше представление простое, оно состоит из кода функции и
оператора импорта. Вот содержимое файла
views.py
:
# -*- coding: utf-8 -*-
from django.http import HttpResponse
def hello(request):
return HttpResponse("Здравствуй, Мир")
Пройдёмся по коду строка за строкой:
Сначала мы импортируем класс
HttpResponse
, который определён в модуле django.http. Нам необходимо импортировать этот класс, так как он используется в нашем коде.Затем, мы определяем функцию
hello
— функцию представления.Каждая функция представления принимает как минимум один параметр, который для удобства называют request. Это объект, который содержит информацию об обрабатываемом запросе, который привёл к вызову данной функции представления. Объект является экземпляром класса
django.http.HttpRequest
. В данном примере, мы ничего не делаем с этим объектом, но не смотря ни на что, он всегда должен быть первым параметром функции представления.Следует отметить, что имя функции представления несёт только смысловую нагрузку для разработчика. Мы дали функции имя
hello
, так как такое имя явно определяет назначение функции, но мы могли бы её назвать и такhello_wonderful_beautiful_world
и так далее. Следующий раздел, «Ваша первая привязка URL», проливает свет на то, как Django находит функцию.Функция является однострочной. Она просто возвращает
HttpResponse
объект, который был создан с текстом «Здравствуй, мир».
Основная идея в том, что представление является функцией языка
Python, которая принимает HttpRequest
в
качестве первого параметра и возвращает экземпляр
HttpResponse
. Для того, чтобы функция
языка Python стала функцией представления Django, он должен
соответствовать этим двум правилам. Есть исключения из этих
правил, но мы рассмотрим их позже.
Если в этот момент вы бы запустили снова команду
python manage.py runserver, то вы бы
увидели сообщение «Welcome to Django» без единого
следа нашего представления. Так происходит потому, что наш
проект mysite ещё не знает о представлении
hello
. Нам потребуется явно указать
Django, что мы активируем данное представление для конкретного
URL. (Продолжая нашу аналогию с публикацией статичных HTML
файлов, как будто бы мы создали HTML файл, но ещё не закачали
его в каталог на сервере.) Для привязки функции представления
к конкретному URL в Django используются файлы привязки URL.
Файл привязки URL можно рассматривать как
таблицу с содержанием вашего сайта. Проще говоря, этот файл
определяет соответствие между URL и функциями представления,
которые должны быть вызваны для этих URL. Именно так вы
указываете Django: «Для данного URL, вызывай этот код, а для этого URL вызывай вот этот код.» Например,
«Если кто-нибудь посетит URL /foo/,
вызывай функцию представления foo_view()
,
которая расположена в модуле
views.py
.»
Когда вы запустили django-admin.py startproject в предыдущей главе, скрипт
автоматически создал для вас файл привязки:
urls.py
. По-умолчанию, он выглядит
примерно так:
from django.conf.urls.defaults import *
# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()
urlpatterns = patterns('',
# Example:
# (r'^mysite/', include('mysite.foo.urls')),
# Uncomment the admin/doc line below and add 'django.contrib.admindocs'
# to INSTALLED_APPS to enable admin documentation:
# (r'^admin/doc/', include('django.contrib.admindocs.urls')),
# Uncomment the next line to enable the admin:
# (r'^admin/', include(admin.site.urls)),
)
Этот стандартный файл привязки включает несколько закомментированных блоков, просто раскомментируйте их, если вам нужен соответствующий функционал. Если проигнорировать закомментированные строки, то останется только это:
from django.conf.urls.defaults import *
urlpatterns = patterns('',
)
Давайте пройдём по каждой строчке этого кода:
Первая строка импортирует все объекты из модуля django.conf.urls.defaults, который содержит всю инфраструктуру для работы с файлами привязки. Там же находится функция
patterns
.Вторая строка вызывает функцию
patterns
и сохраняет результат в переменнуюurlpatterns
. Функцияpatterns
принимает единственный аргумент — пустую строку. (Эта строка может быть использована для передачи общего префикса для функций представления, эта особенность будет описана в главе «Усовершенствованные представления и схемы URL».)
Основным элементом данного кода является переменная
urlpatterns
, которую Django ожидает найти в вашем файле привязки. Эта переменная определяет соответствие между списком URL и кодом, который обрабатывает данные URL. По-умолчанию, как вы можете видеть, файл привязки пуст — ваше Django приложение ещё не настроено. (Именно так
Django определяет, что следует показывать страницу
«Welcome to Django». Если ваш файл привязки пуст,
Django предполагает, что вы только что начали новый проект и,
следовательно, отображает данное сообщение.)
Для того, чтобы добавить URL и представление в файл привязки,
просто добавьте кортеж, объединяющий URL и функцию
представления. Ниже показана привязка для нашего представления
hello
:
from django.conf.urls.defaults import *
from mysite.views import hello
urlpatterns = patterns('',
('^hello/$', hello),
)
(Следует отметить, что мы убрали закомментированные строчки для ясности. Вы можете оставить эти строки, если вам захочется.)
Мы сделали следующие изменения:
Сначала мы проимпортировали представление
hello
из его модуля —mysite/views.py
, которое преобразовалось в mysite.views.Затем, мы добавили строку ('^hello/$', hello) в
urlpatterns
. Такая строка известна как шаблон URL. Это обычный кортеж языка Python, в котором первый элемент является шаблоном регулярного выражения, а второй элемент — функция представления, которая должна использоваться при совпадении данного шаблона.
В двух словах, мы просто указали Django, что любой запрос к
URL /hello/ должен быть обработан с помощью
функции представления hello
.
Ваш PYTHONPATH
Ваш PYTHONPATH является списком каталогов вашей системы, где интерпретатор Python производит поиск модулей в момент когда вы используете оператор import.
Например, допустим, что путь имеет следующее значение:
['', '/usr/lib/python2.4/site-packages', '/home/username/djcode/']
При выполнении кода:
from foo import bar
интерпретатор сначала проверит наличие файла
foo.py
в текущем каталоге. (Первым
элементом списка идёт пустая строка, которая означает
«текущий каталог».) Если такого файла там
нет, то интерпретатор ищет файл в каталоге
/usr/lib/python2.4/site-packages
,
затем в каталоге
/home/username/djcode/
. Наконец, если
файл всё ещё не найден, интерпретатор возвращает
ImportError.
Если вам интересно посмотреть на значения пути, запустите интерпретатор и выполните следующие команды:
>>> import sys
>>> print sys.path
В общем случае вам не требуется беспокоиться о настройке
пути. Это задача Python и Django, они сами об этом
позаботятся. (Настройка пути, это одна из задач, которыми
занимается скрипт manage.py
.)
Стоит обсудить синтаксис данного шаблона URL, так как он может быть не совсем очевиден. Несмотря на то, что шаблон должен совпадать с /hello/, он выглядит немного не так. Объясним почему:
Django удаляет слеш вначале каждого URL, перед его проверкой относительно шаблонов. Это означает, что наш шаблон не включает ведущего слеша в /hello/. (Сперва, это может показаться запутанным, но данное требование всё упрощает — например, включение одного файла привязок в другой, которое мы рассмотрим в главе «Усовершенствованные представления и схемы URL».)
Шаблон включает в себя символы ^ и $. Они являются символами регулярного выражения, которые имеют особое значение: ^ означает «требовать, чтобы шаблон совпадал с начала строки», а $ означает «требовать, чтобы шаблон совпадал до конца строки».
Данный подход лучше объяснять на примере. Если бы мы использовали шаблон '^hello/' (без завершающего $), тогда любой URL, начинающийся с /hello/ совпадал бы с шаблоном. Например, такие как /hello/foo и hello/bar, а не только /hello/. Аналогично, если бы мы опустили начальный ^ (т.е., 'hello/$'), Django будет обрабатывать любой URL, который оканчивается на hello/. Например, такой как foo/bar/hello/. Если бы мы просто указали в качестве шаблона 'hello/', без символов ^ и $, тогда шаблону бы соответствовал любой URL, содержащий hello/. Например, такой как /foo/hello/bar. Следовательно, мы используем оба этих специальных символа для точного определения нашего шаблона. Он должен совпадать только с /hello/, не больше и не меньше.
Большинство ваших шаблонов для URL будут соответствовать вышеописанному правилу. Но неплохо было бы иметь больше гибкости для выполнения более изощрённых проверок.
Вы можете удивиться тому, что произойдёт, если кто-нибудь запросит страницу по URL /hello (то есть, без завершающего слеша). Так как наш шаблон требует наличие завершающего слеша, этот URL не будет распознан. Тем не менее, по умолчанию, любой запрос к URL, который не совпадает с шаблоном и не завершается слешом, перенаправляется на тот же URL с добавленным завершающем слешом. (Это поведение регулируется параметром конфигурации Django
APPEND_SLASH
, который описан в приложении D FIXME.)Если вы относитесь к той группе людей, которые предпочитают URL с завершающими слешами (таких большинство среди разработчиков Django), всё, что вам потребуется сделать — добавить завершающий слеш в каждый шаблон URL и установить значение переменной
APPEND_SLASH
в True. Если вы предпочитаете иной вариант (по той или иной причине), установитеAPPEND_SLASH
в False.
Следует отметить ещё один важный момент. В шаблоне URL мы
передаём функцию представления hello
в
виде объекта, без его вызова. Это возможно благодаря ключевой
особенности языка Python (и любого другого динамического
языка): функции являются объектами первого рода, это означает,
что вы можете передавать их в другие объекты аналогично
переменным. Прикольно, не так ли?
Для того, чтобы протестировать наши изменения внесённые в файл привязок, запустите тестовый сервер, как это было показано в главе «Начинаем», выполнив команду python manage.py runserver. (Если вы не останавливали его работу, это тоже неплохо. Тестовый сервер автоматически обнаруживает изменения в вашем коде и выполняет его перезагрузку по необходимости, таким образом, вам не надо делать это вручную.) Сервер привязывается к адресу http://127.0.0.1:8000/, так что откройте браузер и пройдите по ссылке http://127.0.0.1:8000/hello/. Вы должны увидеть текст «Здравствуй, Мир» — результат работы вашего представления.
Ура! Вы создали вашу первую страницу с помощью Django.
Регулярные выражения
Регулярные выражения[6] — компактный метод определения шаблонов в тексте. В то время как схема URL Django позволяет использование определённых регулярных выражений для работы с URL, вероятно на практике вы будете использовать не так много регулярных выражений для шаблонов. В таблице «Выборка наиболее используемых шаблонов» приведена выборка наиболее используемых шаблонов.
Таблица 3.1. Выборка наиболее используемых шаблонов
Символ | Совпадает |
---|---|
. (точка) | Любой символ |
\d | Любая цифра |
[A-Z] | Любая буква (верхний регистр) |
[a-z] | Любая буква (нижний регистр) |
[A-Za-z] | Любая буква (любой регистр) |
+ | Один или более символов предыдущего выражения, т.е. \d+ совпадает с одной или более цифрами |
[^/]+ | Все символы подряд, кроме слэша |
? | Наличие или отсутствие предыдущего выражения, т.е. \d? описывает возможное наличие одной цифры |
{1, 3} | От одного до трёх (символов) предыдущего выражения |
В текущий момент наш файл привязок определяет единственный шаблон: тот, который обрабатывает запросы по URL URL. Что произойдёт при запросе другого URL?
Чтобы узнать это запустите тестовый сервер и посетите страницу такую как http://127.0.0.1:8000/goodbye/ или http://127.0.0.1:8000/hello/subdirectory/, или даже такую http://127.0.0.1:8000/ (корень сайта). Вы должны увидеть сообщение «Страница не найдена» (см. картинку FIXME). Django отображает это сообщение, потому что вы запросили URL, который не был определён в файле привязок.
Назначение данной страницы идёт значительно дальше простого отображения сообщения об ошибке 404. Она также точно вам указывает какой файл привязки использовало Django и показывает каждый шаблон из этого файла. Из этой информации вы получаете возможность понять, почему была вызвана ошибка 404.
Обычно, эта информация предназначена только для вас, для разработчика. В случае боевого сайта, выставленного в Интернет, врядли вы пожелаете показывать такую информацию неизвестным людям. По этой причине страница с подробностями об ошибке 404 отображается только в том случае, когда ваш проект находится в режиме отладки. Мы расскажем как деактивировать режим отладки позже. Сейчас просто запомните, что новый проект Django всегда создаётся со включенным режимом отладки, и что когда проект не находится в этом режиме, Django показывает совсем другое сообщение об ошибке 404.
Как было описано в последнем разделе, вы увидите сообщение об ошибке 404 в случае, если вы перейдёте в корень сайта — по URL http://127.0.0.1:8000/. Django ничего не добавляет к корню сайта. Данный URL никоим образом не является чем-то особенным. Назначить корню сайта соответствующий шаблон — это целиком ваша задача, как и всё остальное в вашем файле привязки.
Шаблон для корня сайта не совсем очевиден, наверное стоит это отметить. Когда вы будете готовы реализовать представление для корня сайта, используйте шаблон '^$', который соответствует пустой строке. Например:
from mysite.views import hello, my_homepage_view
urlpatterns = patterns('',
('^$', my_homepage_view),
# ...
)
[6] Для информации по регулярным выражениям обращайтесь на http://www.djangoproject.com/r/python/re-module/ и на http://docs.python.org/lib/re-syntax.html.
0 комментариев | Оставьте комментарий