Формы Django

Опубликовал: Thursday, January 26, 2024 в категории Django | Пока нет комментариев

HTML-формы - становой хребет интерактивных веб-сайтов. Это может быть единственное поле для ввода поискового запроса, как на сайте Google, вездесущая форма для добавления комментария в блог или сложный специализированный интерфейс ввода данных. В этой главе мы расскажем, как Django позволяет обратиться к данным, которые отправил пользователь, проверить их и что-то с ними сделать. Попутно мы расскажем об объектах HttpRequest и Form.

Получение данных из объекта запроса

Мы познакомились с объектами HttpRequest в главе 3 при рассмотрении функций представления, но тогда говорить о них было почти нечего. Напомним, что любая функция представления принимает объект HttpRequest в качестве первого параметра, например:

from django.http import HttpResponse

def hello(request):

return HttpResponse("Hello world")

У объекта HttpRequest, каковым является переменная request, есть целый ряд интересных атрибутов и методов, с которыми необходимо познакомиться, чтобы знать, какие существуют возможности. С их помощью можно получить информацию о текущем запросе (например, имя пользователя или версию броузера, который загружает страницу вашего сайта) в момент выполнения функции представления.

Информация об URL

В объекте HttpRequest содержится информация о запрошенном URL, показанная в табл. 7.1.

Таблица 7.1. Атрибуты и методы объекта HttpRequest

Атрибут/метод

Описание

Пример

request.path

Полный путь, не включая домен, но включая ведущий символ слеша

"/hello/"

request.get_host()

Доменное имя

"127.0.0.1:8000" или "www.example.com"

request.get_full_path()

Путь path вместе со строкой запроса (если присутствует)

"/hello/?print=true"

request.is_secure()

True, если запрос отправлен по протоколу HTTPS, иначе False

True или False

Всегда пользуйтесь атрибутами и методами, перечисленными в табл. 7.1, а не «зашивайте» URL в код функции представления. В этом случае код будет более гибким, допускающим повторное использование в других местах. Вот простенький пример:

# ТАК ПЛОХО!

def current_url_view_bad(request):

return HttpResponse("Ao6po пожаловать на страницу /current/")

tt А ТАК ХОРОШО

def current_url_view_good(request):

return HttpResponse("Ao6po пожаловать на страницу %s" % request.path)

Другая информация о запросе

request.МЕТА - это словарь Python, содержащий все HTTP-заголовки данного запроса, включая IP-адрес пользователя и информацию об агенте пользователя (обычно название и номер версии веб-броузера). Отметим, что в список входят как заголовки, отправленные пользователем, так и те, что были установлены вашим веб-сервером. Ниже перечислены некоторые часто встречающиеся ключи словаря:

•    HTTP_REFERER: ссылающийся URL, если указан. (Обратите внимание на ошибку в написании слова REFERER.)

•    HTTP_USER_AGENT: строка с описанием агента пользователя (если указана). Выглядит примерно так:

"Mozilla 5.0 (Х11; U; Linux i686) Gecko/20080829 Firefox/2.0.0.17"

•    REM0TE_ADDR: IP-адрес клиента, например "12.345.67.89". (Если запрос проходил через прокси-серверы, то это может быть список IP-адресов, разделенных запятыми, например "12.345.67.89,23.456.78.90".)

Отметим, что поскольку request.МЕТА - обычный словарь Python, то при попытке обратиться к несуществующему ключу будет возбуждено исключение KeyError. (Поскольку HTTP-заголовки - это внешние данные, то есть отправлены пользовательским броузером, доверять им нельзя, поэтому вы должны проектировать свое приложение так, чтобы оно корректно обрабатывало ситуацию, когда некоторый заголовок пуст или отсутствует.) Нужно либо использовать try/except-блок, либо осуществлять доступ по ключу методом get():

tt ПЛОХО!

def ua_display_bad(request):

ua = request. META[‘ HTTP_USER_AGENT’] tt Может возникнуть KeyError! return HttpResponseC’Baiu броузер %s" % ua)

tt ХОРОШО (ВАРИАНТ 1)

def ua_display_good1(request): try:

ua = request. META[‘HTTP_USER_AGENT’] except KeyError:

ua = ‘unknown’ return HttpResponseC’Baiu броузер %s" % ua)

tt ХОРОШО (ВАРИАНТ 2)

def ua_display_good2(request):

ua = request.META.get(‘HTTP_USER_AGENT’, ‘unknown’) return HttpResponseC’Baiu броузер %s" % ua)

Мы предлагаем написать несложное представление, которое будет отображать все содержимое словаря request.МЕТА, чтобы вы знали, что в нем находится. Вот один из возможных вариантов такого представления:

def display_meta(request):

values = request.МЕТА.items() values.sort() html - []

for k, v in values:

html.append(‘<tr><td>%s</td><td>%s</td></tr>’ % (k, v)) return HttpResponseC<table>%s</table>’ % ‘\n’.join(html))

В качестве упражнения попробуйте преобразовать это представление в шаблон Django, вынеся HTML-разметку из кода. Кроме того, попробуйте включить в состав выводимой информации значение request, path и других атрибутов HttpRequest, которые были описаны в предыдущем разделе.

Информация об отправленных данных

Помимо основных метаданных о запросе объект HttpRequest имеет два атрибута, в которых хранится отправленная пользователем информация: request.GET и request. POST. Тот и другой объекты похожи на словарь и дают доступ к данным, отправленным соответственно методом GET или POST.

POST-данные обычно поступают из HTML-формы (тег <form>), а GET-дан- ные - из формы или строки запроса, указанной в гиперссылке на странице.

Объекты, подобные словарю

Говоря, что объекты request.GET и request.POST похожи на словарь, мы имеем в виду, что они ведут себя как стандартные словари Python, хотя технически таковыми не являются. Так, объекты

request.GET и request.POST обладают методами get(), keysQ и val- ues() и позволяют перебрать все ключи с помощью конструкции

for key in request.GET.

Тогда почему мы говорим об «объектах, подобных словарю», а не просто о словарях? Потому что у объектов request.GET и request. POST имеются методы, отсутствующие у обычных словарей.

Возможно, вы и раньше встречались с такими «объектами- имитаторами», то есть объектами Python, обладающими некоторыми базовыми методами, например readQ, что позволяет использовать их вместо «настоящих» файловых объектов.

Источник: Головатый А., Каплан-Мосс Дж. Django. Подробное руководство, 2-е издание. - Пер. с англ. - СПб.: Символ- Плюс, 2010. - 560 е., ил.

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

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

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