|
Оглавление
|
В нашем представлении Давайте создадим третье представление, которое отображает текущую дату и время со смещением на указанное количество часов. Цель — реализовать функциональность, с помощью которой сайт будет по URL /time/plus/1/ отдавать текущее время сдвинутое на час вперёд, а по URL /time/plus/2/ — на два часа вперёд и так далее. Новичок может подумать, что потребуется создавать функцию представления для каждого смещения часа, что может выразится в следующей схеме URL: urlpatterns = patterns('',
('^time/$', current_datetime),
('^time/plus/1/$', one_hour_ahead),
('^time/plus/2/$', two_hours_ahead),
('^time/plus/3/$', three_hours_ahead),
('^time/plus/4/$', four_hours_ahead),
)
Очевидно, это направление мысли является ущербным. Такой подход не только приведёт к избыточности функций представления, но и к тому, что приложение будет явно ограничено заранее заданным диапазоном смещений — один, два, три или четыре часа. Если мы решим создать страницу, которая отображает текущее время со смещением на пять часов вперёд, нам потребуется создать отдельное представление и внести дополнительную строчку в схему URL, продолжая создавать избыточность. Нам потребуется немного окунуться в теорию. Слово о красивых URL
Если вы работали с другими платформами разработки
web-приложения, такими как PHP или Java, вы можете подумать:
«Эй, давайте использовать параметр строки запроса!» — что-нибудь аналогичное
/time/plus?hours=3, в котором смещение будет
указано через параметр Вы можете сделать так и с Django (и мы расскажем об этом в главе 7 FIXME), но Django пропагандирует философию использования красивых URL. URL /time/plus/3/ гораздо яснее, проще, более читаемое, его проще сказать кому-нибудь вслух и ... просто проще, чем его оппонент. Красивый URL являются характеристикой качества web-приложения. Система схемы URL Django поощряет создание красивых URL, упрощая использование таких URL, в отличие от других.
Как же мы должны спроектировать наше приложение для обработки соответствующих смещений времени? Ответ лежит в использовании шаблонов подстановки. Как мы упоминали ранее, шаблон URL является регулярным выражением. Следовательно, мы можем использовать шаблон \d+ для выделения одной или более цифр: urlpatterns = patterns('',
# ...
(r'^time/plus/\d+/$', hours_ahead),
# ...
)
(Мы используем #..., чтобы показать, что здесь могут быть другие шаблоны, которые мы временно исключили из данного примера.) Новый шаблон схемы URL будет соответствовать любому URL, подобному /time/plus/2/, /time/plus/25/ и даже /time/plus/100000000000/. Давайте ограничим смещение 99-ю часами. Это означает, что мы разрешаем только одно- или двухзначиные числа. На языке регулярных выражений это преобразовывается в \d{1,2}: (r'^time/plus/\d{1,2}/$', hours_ahead),
ЗамечаниеПри разработке web-приложения, важно всегда рассматривать наиболее диковинные варианты ввода данных и решать должно или нет приложение обрабатывать такой ввод. Мы ограничили здесь возможности ввода смещения 99-ю часами.
Ещё одной важной деталью, которую мы ввели здесь, является символ r в начале строки регулярного выражения. Он указывает Python, что строка является «сырой» — в её содержимом не следует интерпретировать обратные слеши. В обычной строке Python, обратные слеши используются для экранирования особых символов, например, \n — односимвольная строка. Если предварить её символом r, сделав её «сырой», Python не будет выполнять экранирование — таким образом, r'\n' станет двухсимвольной строкой, содержащей обратный слеш и символ n. Существует естественная коллизия между обычными обратными слешами и используемыми в регулярных выражениях. Крайне рекомендуется всегда использовать сырые строки при определении регулярных выражений в Python. С этого момента следует считать, что все шаблоны URL, показанные в этой книге, будут представлены сырыми строками. После применения символов подстановки в URL необходим способ передачи выделенных подстановкой данных в функцию представления, это позволит нам использовать единственную функцию представления для любого разрешённого смешения часов. Мы осуществляем это с помощью установки скобок вокруг интересующей нас части шаблона URL. В рамках нашего примера, это будет любое число в URL, таким образом, надо расположить скобки вокруг выражения \d{1,2}, например: (r'^time/plus/(\d{1,2})/$', hours_ahead),
Если у вас уже есть опыт работы с регулярными выражениями, то вам будет легко. Мы используем скобки для выделения данных из совпавшего текста. В итоге схема URL будет выглядеть так: from django.conf.urls.defaults import *
from mysite.views import hello, current_datetime, hours_ahead
urlpatterns = patterns('',
(r'^hello/$', hello),
(r'^time/$', current_datetime),
(r'^time/plus/(\d{1,2})/$', hours_ahead),
)
Теперь напишем представление Порядок разработкиВ данном примере мы сначала создали шаблон URL, а затем представление. Но в предыдущих примерах, мы сначала создавали представление, а затем — шаблон URL. Какой подход лучше? Хорошо, каждый разработчик уникален. Если вам комфортно видеть весь проект целиком, может быть вам будет проще создать схему URL для всего функционала сайта за один раз, в начале проекта, а затем реализовать каждую функцию представления. Такой подход имеет преимущество, так как предостявляет ясный список работа и, по сути, определяет требования к параметрам функций представления, которые вам потребуется реализовать. Если вам комфортно разрабатывать проект, начиная с небольших компонентов, может быть вы предпочтёте сначала реализовать представления, а затем ассоциировать их с URL. Такой подход тоже имеет право на жизнь. В конце концов, не важно какой из подходов лучше или хуже. Они оба правильные.
Представление from django.http import Http404, HttpResponse
import datetime
def hours_ahead(request, offset):
try:
offset = int(offset)
except ValueError:
raise Http404()
dt = datetime.datetime.now() + datetime.timedelta(hours=offset)
html = "<html><body>In %s hour(s), it will be %s.</body></html>" % (offset, dt)
return HttpResponse(html)
Рассмотрим каждую строчку этого кода:
Реализовав данную функцию представления и привязав её к URL, запустите тестовый сервер Django (если он ещё не запущен) и посетите http://127.0.0.1:8000/time/plus/3/ для проверки работы функции. Затем попробуйте http://127.0.0.1:8000/time/plus/5/. Затем http://127.0.0.1:8000/time/plus/24/. Наконец, посетите http://127.0.0.1:8000/time/plus/100/, чтобы проверить, что шаблон URL принимает только одно- или двухсимвольные числа. Django должна отобразить «Страница не найдена» в этом случае. http://127.0.0.1:8000/time/plus/ (без указания часов) также должен вызвать ошибку 404. |
Увидели ошибку?
Выделите её мышкой и нажмите
-
Обработано:
511
49
130
71
Версия книги
1.0
2.0
Версия 2.0 в процессе перевода!
Мой луч
Многообразие света
Полезное
Актуальные вакансии,
Python работа
для python-разработчиков.
Скачать в формате
CHM от 2 сентябряЗаказать PDF файл можно через почту, чат, джаббер. Всего 2WMZ. Содержимое точно соответствует содержимому сайта. Чем чаще заказываете — тем больше перевожу. Русская группа
Ускорить процесс перевода!
R130494980980
Z425285133788 E112528079659 U327380922061 Книга помогла реализовать:
|
| © 2008-2009 Ruslan Popov @ gmail.com | Powered by Django 1.1 beta 1 SVN-11114 |