URL-адреса Django

Мы собираемся сделать нашу первую веб-страничку — домашнюю страницу твоего блога! Но для начала давай чуть ближе познакомимся с URL-адресами в Django.

Что такое URL-адрес?

URL — это просто адрес в интернете. Ты можешь увидеть URL каждый раз, когда посещаешь веб-сайт — он отображается в адресной строке твоего браузера (да, 127.0.0.1:8000 — это URL-адрес! И https://djangogirls.org — тоже URL):

URL-адрес

Любая страница в Интернете нуждается в собственном URL-адресе. Таким образом ваше приложение точно знает, что показать пользователю, который открывает конкретный URL-адрес. В Django мы используем так называемый URLconf (англ. URL configuration, конфигурация URL). URLconf — это набор шаблонов, которые Django попробует сравнить с полученным URL, чтобы выбрать правильный метод для отображения (view).

Как URL-адреса работают в Django?

Давай откроем файл mysite/urls.py в нашем редакторе и посмотрим, как он выглядит:

mysite/urls.py

"""mysite URL Configuration

[...]
"""
from django.conf.urls import url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
]

Как можешь заметить, Django уже кое-что разместил здесь для нас.

Строки, расположенные между тройными кавычками (''' или """), называются docstrings — ты можешь добавить их в начале файла, класса или метода для описания их функциональности. Python будет их игнорировать при запуске приложения.

URL-адрес раздела администрирования, который мы посещали в предыдущей главе, уже здесь присутствует:

mysite/urls.py

    url(r'^admin/', admin.site.urls),

Таким образом, любому URL-адресу, начинающемуся с admin/, Django будет находить соответствующее view (представление). В этом случае мы охватываем большое количество различных URL-адресов, которые явно не прописаны в этом маленьком файле — так он становится более аккуратным и удобочитаемым.

Regex

Ты спрашиваешь себя, как Django сопоставляет URL-адреса и представления? Ну, это не так просто. В Django используются так называемые регулярные выражения (англ. «regular expressions» — сокращённо regex). Регулярные выражения имеют множество (множество!) правил, которые формируют поисковый шаблон. Поскольку регулярные выражения являются довольно сложной темой, мы не будем рассматривать их подробно.

Если ты все еще хочешь разобраться в написании шаблонов, приведём пример — нам потребуется лишь ограниченное число правил для описания шаблона, а именно:

  • ^ — начало текста;
  • $ — конец текста;
  • \d — цифра;
  • + — чтобы указать, что предыдущий элемент должен быть повторен как минимум один раз;
  • () — для получения части шаблона.

Всё остальное в шаблоне URL будет интерпретироваться буквально.

Теперь представь, что у нас есть веб-сайт с адресом http://www.mysite.com/post/12345/, где 12345 — номер записи в блоге.

Писать представления для всех номеров будет весьма утомительно. С помощью регулярных же выражений мы можем создать шаблон, соответствующий url, который позволит извлекать из адреса номер: ^post/(\d+)/$. Давай разобьём шаблон на части, чтобы понять логику его работы:

  • ^post/ говорит Django рассматривать url с post/ в начале (сразу после ^);
  • (\d+) означает, что дальше должен присутствовать номер (одна или несколько цифр) и мы хотим извлечь его из url;
  • / говорит Django об очередном символе / после номера;
  • $ означает конец url, т.е. шаблону соответствуют только адреса с / на конце.

Твой первый URL-адрес в Django!

Пришло время создать твой первый URL-адрес! Мы хотим, чтобы 'http://127.0.0.1:8000/' возвращал домашнюю страничку нашего блога со списком записей в нём.

Мы также хотим сохранить файл mysite/urls.py в максимально аккуратном виде, так что мы импортируем URL-адреса для нашего приложения blog в mysite/urls.py.

Вперёд, добавь строку для импорта blog.urls. Обрати внимение, что здесь мы используем функцию include, поэтому тебе придется импортировать её в первой строке своего файла.

Файл mysite/urls.py должен выглядеть следующим образом:

mysite/urls.py

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'', include('blog.urls')),
]

Django теперь будет перенаправлять все запросы 'http://127.0.0.1:8000/' к blog.urls и искать там дальнейшие инструкции.

При написании регулярных выражений на Python всегда указывай r в начале строки. Это полезный намёк для Python, что строка может содержать специальные символы, предназначенные не для самого Python, а для регулярного выражения.

blog.urls

Создай новый пустой файл blog/urls.py. Отлично! Добавь в него следующие две строки:

blog/urls.py

from django.conf.urls import url
from . import views

Так мы импортировали функцию url Django и все views (представления) из приложения blog (у нас их пока нет, но через минуту они появятся!)

После этого мы можем добавить наш первый URL-шаблон:

blog/urls.py

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/ в браузере, то увидишь сообщение о том, что веб-страница недоступна. Это произошло потому, что сервер (помнишь, как мы набирали runserver?) перестал обрабатывать запросы. Чтобы понять почему, открой окно своей командной строки.

Ошибка

В твоей командной строке появилось сообщение об ошибке, но не беспокойся — оно, на самом деле, довольно полезно. Ты можешь прочесть, что не существует атрибута с именем 'postlist' — _no attribute 'post_list'. Это название представления, которое Django пытается найти и использовать, но мы же его ещё не создали. В данный момент раздел /admin/ тоже не будет работать. Не беспокойся, мы этим займёмся.

Если хочешь узнать больше о Django URLconfs, посмотри официальную документацию: https://docs.djangoproject.com/en/1.11/topics/http/urls/

results matching ""

    No results matching ""