Обработка сохраняемых фрагментов текста Django

Опубликовал: Monday, January 30, 2024 в категории 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 е., ил.

Похожие посты:

Комментировать

Your email address will not be published. Required fields are marked *