Обработка сохраняемых фрагментов текста Django
Каждый сохраняемый аргумент передается представлению в виде обычной Unicode-строки вне зависимости от его особенностей. Например, при сопоставлении со следующим образцом аргумент year будет передан представлению views.year_archive() как строка, а не как целое число, несмотря на то что выражение \d{4} совпадает только со строками, состоящими из одних цифр:
(г1~articles/(?P<year>\d{4})/$’, views.year_archive),
Об этом важно помнить при написании кода представлений. Многие встроенные функции языка Python принимают объекты строго определенного типа (и это правильно). Типичная ошибка - пытаться создать объект datetime.date, передав конструктору строки вместо целых чисел:
»> import datetime
»> datetime.dateC 1993′, ‘7’, ‘9’)
Traceback (most recent call last):
TypeError: an integer is required »> datetime.date(1993, 7, 9) datetime.date(1993, 7, 9)
В применении к конфигурации URL и представлениям эта ошибка проявится в следующей ситуации:
tt urls. py
from django.conf.urls.defaults import * from mysite import views
urlpatterns = patternsC’,
(r’~articles/(\d{4})/(\d{2})/(\d{2})/$’. views.day_archive).
)
tt views, py import datetime
def day_archive(request, year, month, day):
tt В следующей инструкции возникнет исключение TypeError! date = datetime.date(year, month, day)
Корректный код day_archive() выглядит так:
def day_archive(request, year, month, day):
date = datetime.date(int(year), int(month), int(day))
Отметим, что сама функция int() возбуждает исключение ValueError, если ей передается строка, содержащая что-то, кроме цифр, но в данном случае этого не произойдет, потому что регулярное выражение в образце URL написано так, что функции представления передается строка, состоящая из одних цифр.
Что сопоставляется с образцами URL
При получении запроса Django пытается сопоставить перечисленные в конфигурации URL образцы с адресом URL запроса, который интерпретируется как строка Python. При сопоставлении не принимаются во внимание ни параметры GET и POST, ни доменное имя. Также игнорируется символ слеша в начале, потому что он присутствует в любом URL.
Например, при обращении к URL http://www.example.com/myapp/ Django будет сопоставлять с образцами строку туарр/, так же как и при обращении к URL http://www.example.com/myapp/?page=3.
Метод отправки запроса (например, POST или GET) не учитывается при сопоставлении. Иными словами, независимо от метода отправки запроса он будет передан для обработки одной и той же функции, которая сама должна организовать ветвление по методу запроса.
Источник: Головатый А., Каплан-Мосс Дж. Django. Подробное руководство, 2-е издание. - Пер. с англ. - СПб.: Символ- Плюс, 2010. - 560 е., ил.
Похожие посты:
- Шаблон проектирования MVC (0)
- Второе представление: динамическое содержимое (0)
- Справочник по встроенным фильтрам add Django (0)
- Конфигурация URL и слабая связанность (0)
- Третье представление: динамические URL-адреса (0)
- Красиво отформатированные страницы ошибок в Django (0)
- Использование шаблонов в представлениях Django (0)