Django Book: второе представление – динамический контент

By | 02/03/2015
 

django_logo_2Наше первое представлениеHello world” было достаточно информативным для демонстрации основ того, как работает Django, но это не был пример настоящей динамической страницы, потому что содержимое страницы всегда было одно и то же. Каждый раз, когда вы обращаетсь к /hello/ – вы видите одну и ту же статическую страницу HTML.

Для нашего следующего представления – давайте создадим нечто более динамическое – страницу, которая будет отображать текущее время и дату. Это простой шаг, потому что тут не используется база данных или какой-либо ввод данных от пользователя – а просто вывод времени вашего сервера. Это лишь ненамного сложнее, чем “Hello world“, но мы сможем продемонстрировать несколько новых понятий.

Это представление должно выполнять два действия: вычислить текущие время и дату, и вернуть HttpResponse, который будет содержать эти данные. Если вы знакомы с Python 🙂 – вы должны знать, что в нём есть модуль datetime для вычисления даты. Вот как он используется:

>>> import datetime
>>> now = datetime.datetime.now()
>>> now
datetime.datetime(2015, 2, 2, 23, 1, 13, 162098)
>>> print now
2015-02-02 23:01:13.162098

Это было очень просто, и не имеет ничего общего с Django – это просто код на Python.

Что бы написать Django-представление, которое будет выводить дату и время, нам надо использовать выражение datetime.datetime.now() в этом представлении и вернуть HttpResponse. Вот как это может выглядеть:

from django.http import HttpResponse
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)

Как и в случае с представлением функции hello – нам надо поместить этот код в файл views.py. Вот как будет выглядеть весь файл целиком:

from django.http import HttpResponse
import datetime

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

def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)

(далее мы не будем отображать код из предыдущих примеров в новых примерах кода, кроме тех случаев, когда это необходимо – вы должны понимать из контекста, какая часть кода новая, а какая – старая)

Давайте пройдёмся по изменениям, которые мы сделали в файле views.py, что бы добавить новое представление current_datetime:

  • мы добавили импорт модуля datetime, что бы иметь возможность вычислять дату;
  • новая функция current_datetime вычисляет текущие время и дату как объект datetime.datetime и сохраняет значеиние в локальную переменную now;
  • вторая страка кода внутри представления создаёт HTML-ответ, используя форматирование строк. Знак %s в строке является заполнителем, а знак % после строки означает “Заменить %s в предыдущей строке значением из переменной now“. Переменная now технически является объектом datetime.datetime, а не строкой, но %s конвертирует её в строковое представление вида “2015-02-02 23:01:13.162098“. В результате мы получим HTML-строку, такую как “<html><body>It is now 2015-02-02 23:01:13.162098.</body></html>” (да, наш код HTML не совсем корректен, но мы стараемся держать пример простым и коротким);
  • в конце-концов – представление возвращает объект HttpResponse , который содержит сгенерированный ответ, точно так же, как и в функции hello.

После добавления этого кода в файл views.py, давайте добавим URLpattern  в файл urls.py, что бы сообщить Django какой URL будет обрабатывать это представление. Например, URL вида /time/ будет вполне уместен:

from django.conf.urls.defaults import patterns, include, url
from example.views import hello, current_datetime

urlpatterns = patterns('',
    url(r'^hello/$', hello),
    url(r'^time/$', current_datetime),
)

Мы сделали два изменения тут. Во-первых – мы импортировали функцию current_datetime. Во-вторых, самое важное, мы добавили новый URLpattern, связывающийс URL /time/ с новым представлением.

С написанным представлением, и обновлённым URLconf, запустите сервер и откройте страницу http://127.0.0.1:8000/time/ в браузере. Вы должны увидеть текущие время и дату.

Часовой пояс Django

В зависимости от вашего сервера, время в результате Django может отличаться от времени на сервере. Это происходит от того, что Django по-умолчанию использует часовой пояс America/Chicago. Если вы живёте в другом часов поясе – измените настройки в файле settings.py. В комментариях к параметру TIME_ZONE вы можете найти ссылку на список всех временных зон (http://en.wikipedia.org/wiki/List_of_tz_zones_by_name)

Продолжение – в статье Django Book: URLconf и “слабые связи”.