Главная | Архив новостей | Общение | Площадка | Примеры OpenID
Хостинг Django от «Джино»
Оглавление

Глава 7. Формы

Перевод © Попов Руслан <ruslan.popov • gmail>

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

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

Мы впервые коснулись объектов HttpRequest в главе «Представления и привязки URL» при начальном изучении функций представления, но мы многого тогда не рассказали. Помните каждая функция представления принимала объект HttpRequest в качестве первого аргумента, как в нашем представлении hello():

from django.http import HttpResponse

def hello(request):
    return HttpResponse("Hello world")

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

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

HttpRequest объекты содержат информацию о запрошенном URL:

Таблица 7.1. Информация об URL

Атрибут/МетодОписаниеПример
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


Всегда используйте эти атрибуты/методы вместо прямого вписывания URL в ваши представления. Такой подход делает код более гибким и его можно будет повторно использовать в других местах. Простейший пример:

# BAD!
def current_url_view_bad(request):
    return HttpResponse("Welcome to the page at /current/")

# GOOD
def current_url_view_good(request):
    return HttpResponse("Welcome to the page at %s" % request.path)

Остальная информация о запросе

Атрибут request.META является словарём, который содержит все доступные HTTP заголовки текущего запроса, включая IP адрес посетителя и информацию об его браузере (название и версию). Следует отметить, что полный список доступных заголовков зависит от того, какие заголовки были посланы браузером посетителя и какие заголовки были установлены веб-сервером. Перечислим несколько стандартных ключей этого словаря:

  • HTTP_REFERER — ссылка на страницу с которой пришли на текущую, если такая существует.

  • HTTP_USER_AGENT — идентификационная строка браузера. Обычно выглядит так: "Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17".

  • REMOTE_ADDR — IP адрес пользователя, т.е., "12.245.67.89". (Если запрос был передан через прокси, тогда адрес может быть передан в виде списка: "12.245.67.89,23.45.78.90".)

Следует отметить, что так как request.META является обычным словарём языка Python, вы получите исключение KeyError, если попытаетесь использовать несуществующий ключ. (Так как HTTP заголовки являются внешними данными — они передаются браузерами посетителей — им не стоит доверять, и вы должны всегда проектировать ваше приложение на грамотную обработку возникающих ошибок, если нужного заголовка нет или он пустой.) Следует использовать блок try/except или метод get() для обработки случая с неопределёнными ключами:

# BAD!
def ua_display_bad(request):
    ua = request.META['HTTP_USER_AGENT']  # Might raise KeyError!
    return HttpResponse("Your browser is %s" % ua)

# GOOD (VERSION 1)
def ua_display_good1(request):
    try:
        ua = request.META['HTTP_USER_AGENT']
    except KeyError:
        ua = 'unknown'
    return HttpResponse("Your browser is %s" % ua)

# GOOD (VERSION 2)
def ua_display_good2(request):
    ua = request.META.get('HTTP_USER_AGENT', 'unknown')
    return HttpResponse("Your browser is %s" % ua)

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

def display_meta(request):
    values = request.META.items()
    values.sort()
    html = []
    for k, v in values:
        html.append('<tr><td>%s</td><td>%s</td></tr>' % (k, v))
    return HttpResponse('<table>%s</table>' % '\n'.join(html))

В качестве упражнения, вы можете преобразовать данный код для использования возможностей шаблонной системы Django, а не использовать «сырой» HTML.

Информация о переданных данных

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

Словарные объекты

Когда мы говорим, что request.GET и request.POST являются «словарными» объектами, мы подразумеваем, что они ведут себя как обычные словари языка Python, но технически не являются словарями. Например, request.GET и request.POST обладают методами get(), keys() и values() и вы можете выполнять итерацию по их ключам, так for key in request.GET.

Так в чём разница? В том, что эти объекты обладают дополнительными методами, которых нет у обычных словарей. Мы ещё остановимся на этом.

Вы можете встретиться с подобным термином — «файловые объекты» — такие объекты обладают несколькими основными методами, подобными read(), которые позволяют работать с ними почти как с настоящими файлами.

POST данные обычно получают из HTML <form>, а GET данные могут приходить как от форм, так и из URL.


Увидели ошибку?
Выделите её мышкой и нажмите
Ctrl-Enter
Обработано:
510 49 130 71

Версия книги
1.0 2.0
Версия 2.0 в процессе перевода!

Мой луч
Многообразие света

Полезное
Актуальные вакансии, Python работа для python-разработчиков.


Скачать в формате
CHM от 2 сентября

Заказать PDF файл можно через почту, чат, джаббер. Всего 2WMZ. Содержимое точно соответствует содержимому сайта.
Чем чаще заказываете — тем больше перевожу.

Русская группа

на поддержку перевода
Яндекс Яндекс.Деньги Хочу такую же кнопку
Ускорить процесс перевода!
R130494980980
Z425285133788
E112528079659
U327380922061

Книга помогла реализовать:
Проект «Мой луч»
АРМ УФМС.


Мой вебсайт стоит666 337,31 руб

© 2008-2009 Ruslan Popov @ gmail.com Powered by Django 1.1 beta 1 SVN-11114
Главная | Архив новостей | Общение | Площадка | Примеры OpenID