Мы собираемся сделать нашу первую веб-страничку — домашнюю страницу твоего блога! Но для начала, давай чуть ближе познакомимся с URL-адресами в Django.
URL — это просто адрес в интернете. Ты можешь увидеть URL каждый раз, когда посещаешь веб-сайт — он отображается в адресной строке твоего браузера (да! 127.0.0.1:8000
это URL-адрес! И https://djangogirls.com
— тоже URL):
Любая страница в Интернете нуждается в собственном URL-адресе. Таким образом ваше приложение точно знает, что показать пользователю, который открывает конкретный URL-адрес. В Django мы используем кое-что под названием URLconf
(англ. URL configuration, конфигурация URL). URLconf — это набор шаблонов, которые Django попробует сравнить с полученным URL, чтобы выбрать правильный метод для отображения (view).
Давай откроем файл mysite/urls.py
в нашем редакторе и посмотрим, как он выглядит:
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
# Examples:
# url(r'^$', 'mysite.views.home', name='home'),
# url(r'^blog/', include('blog.urls')),
url(r'^admin/', include(admin.site.urls)),
]
Как можешь заметить, Django уже кое-что разместил здесь для нас.
Строки, начинающиеся с символа #
являются комментариями -- это означает, что они будут игнорироваться Python. Удобно, не правда ли?
URL-адрес администрирования, который мы посещали в предыдущей главе, уже здесь присутствует:
url(r'^admin/', include(admin.site.urls)),
Таким образом, любому URL-адресу, начинающемуся с admin/
, Django будет находить соответствующее view (представление). В этом случае мы охватываем большое множество различных URL-адресов, которые явно не прописаны в этом маленьком файле -- так он становится более аккуратным и удобочитаемым.
Спрашиваешь себя, как Django сопоставляет URL-адреса и представления? Ну, это не так просто. В Django используются так называемые регулярные выражения (англ. "regular expressions" — сокращённо regex
). Регулярные выражения имеют множество (множество!) правил, которые формируют поисковый шаблон. Поскольку регулярные выражения являются довольно сложной темой, мы остановимся на них чуть подробнее.
Если ты все еще хочешь разобраться в написании шаблонов - нам потребуется лишь ограниченное число правил для описания шаблона, например:
^ начало текста
$ конец текста
\d цифра
+ предыдущий пункт должен быть повторен как минимум один раз
() часть шаблона
Все остальное в шаблоне url будет интерпретироваться буквально.
Теперь представь, что у нас есть веб-сайт с адресом http://www.mysite.com/post/12345/
, где 12345
номер записи в блоге.
Писать представления для всех номеров будет весьма утомительно. С помощью регулярных же выражений мы можем создать шаблон, соответствующий url, который позволит извлекать из адреса номер: ^post/(\d+)/$
. Давай разобьём шаблон на части, чтобы понять его логику:
post/
а начале (сразу после ^
)/
после номера/
на концеПришло время создать твой первый URL-адрес! Мы хотим, чтобы 'http://127.0.0.1:8000/' возвращал домашнюю страничку нашего блога со списком записей в нем.
Мы также хотим сохранить файл mysite/urls.py
в максимально аккуратном виде, так что мы импортируем URL-адреса для нашего приложения blog
в mysite/urls.py
.
Удали комментарии (строки, начинающиеся с #
) и добавь импорт blog.urls
в главный URL (''
).
Файл mysite/urls.py
должен выглядеть следующим образом:
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'', include('blog.urls')),
]
Django теперь будет перенаправлять все запросы 'http://127.0.0.1:8000/' к blog.urls
и искать там дальнейшие инструкции.
При написании регулярных выражений на Python, всегда указывай r
в начале строки. Это полезный намек для Python, что строка может содержать специальные символы, предназначенные не для самого Python, а для регулярного выражения.
Создай новый пустой файл blog/urls.py
. Отлично! Добавь в него следующие две строки:
from django.conf.urls import url
from . import views
Так мы импортировали все методы Django и все views
(представления) из приложения blog
(у нас их пока нет, но через минуту они появятся!)
После этого мы можем добавить наш первый URL-шаблон:
urlpatterns = [
url(r'^$', views.post_list, name='post_list'),
]
Как ты можешь заметить, мы связали view
под именем post_list
с URL-адресом ^$
. Это регулярное выражение будет соответствовать ^
(началу) и следующему $
(концу), т.е. пустой строке. Это правильно, потому что для обработчиков URL в Django 'http://127.0.0.1:8000/' не является частью URL. Этот шаблон скажет Django, что views.post_list
— это правильное направление для запроса к твоему веб-сайту по адресу 'http://127.0.0.1:8000/'.
Последняя часть name='post_list'
— это имя URL, которое будет использовано чтобы идентифицировать его. Оно может быть таким же, как имя представления (англ. view), а может и чем-то совершенно другим. Мы будем использовать именованные URL позднее в проекте, так важно указывать их имена уже сейчас. Мы также должны попытаться сохранить имена URL-адресов уникальными и легко запоминающимися.
Все в порядке? Тогда открой http://127.0.0.1:8000/ в браузере, чтобы увидеть результат.
Теперь нет никакого "оно работает", верно? Не беспокойся, это всего лишь страница ошибки, здесь нечего пугаться! Она, на самом деле, довольно полезна:
Ты можешь прочесть, что не существует атрибута с именем 'post_list' -- no attribute 'post_list'. Не напоминает ли post_list тебе что-нибудь? Так мы назвали свое представление! Это значит, что всё на месте, просто мы ещё не создали наше представление. Не беспокойся, мы этим займемся.
Если хочешь узнать больше о Django URLconfs, посмотри официальную документацию: https://docs.djangoproject.com/en/1.8/topics/http/urls/