#28. Ввeдeние в Django
Общий взгляд на Django, MVC (MVT), urls
План
I. Немного теории
- Клиент-серверная архитектура
- Виды сетевых протоколов
- HTTP сообщения
- Шаблон проектирования MVC
- Фреймворк vs Библиотека
II. Django
- Что такое Django
- Архитектура Django
- Установка Django
- Создание проекта
- Создание приложения
- Urls
- path()
- redirect()
III. Практика / Домашнее задание
IV. Литература (что почитать)
Клиент-серверная архитектура (детальнее)
Клиент – локальный компьютер на стороне пользователя, который выполняет отправку запроса к серверу для возможности предоставления данных или выполнения вычислений.
Параметры, которые могут реализоваться на стороне клиента:
- Площадка по предоставлению пользовательского интерфейса;
- Формулировка запроса к серверу и его последующая отправка;
- Получение итогов запроса и отправка дополнительной группы команд (запросы на добавление, обновление информации, удаление группы данных).
Сервер — компьютер, на котором хранится само приложение. Весь код, вся логика, все дополнительные материалы и справочники.
Параметры, которые могут реализоваться на стороне сервера:
- Хранение, защита и доступ к данным;
- Работа с поступающими клиентскими запросами;
- Процесс отправки ответа клиенту.
Иногда говорят «сервер приложения» и «сервер БД». Это нормально, ведь фактически сервер — это просто машина, компьютер. А базу и сервер приложения обычно хранят на разных машинах, ради безопасности. В таком случае, если говорят «сервер приложения» — речь о втором звене схемы.
БД (база данных) — хранилище данных.
Архитектура системы клиент-сервер формулирует принципы виртуального общения между локальными компьютерами, а все правила и принципы взаимодействия находятся внутри протокола.
Сетевой протокол – это особый набор правил, на основании которого выполняется точное взаимодействие между компьютерами внутри виртуальной сети.
Виды сетевых протоколов
MAC
Media Access Control (MAC) это низкоуровневый сетевой протокол. Используется он для идентификации сетевых устройств.Все устройства, которые подключены к сети Интернет, содержат свой оригинальный MAC-адрес.
IP
На следующем уровне после MAC располагается IP – Internet Protocol, имеющий две основные разновидности IPv4 и IPv6. Он назначает компьютерам уникальные IP-адреса, благодаря которым устройства могут себя обнаруживать в сети.
ICMP, TCP и UDP
Выше IP находятся такие протоколы:
- ICMP (Internet control message protocol), отвечающий за обмен информацией. Не используется для передачи данных. Именно ICMP используется в команде ping и traceroute.
- TCP (Transmission control protocol). Этот сетевой протокол управляет передачей данных. TCP дает гарантия в том, что все переданные пакеты данных будут приняты правильно и ошибки будут полностью исключены.
- UDP (User datagram protocol) похож на TCP, но работает быстрее, так как в нем данные при получении не проверяются. В некоторых случаях использование UDP бывает вполне достаточным.
TCP/IP – совокупность протоколов передачи информации. TCP/IP – это особое обозначение всей сети, которая функционирует на основе протоколов TCP, а также IP.
HTTP
Hyper Text Transfer protocol – протокол для передачи информации (гипертекста), на базе которого функционируют все сегодняшние сайты. В его возможности входит процесс запрашивания необходимых данных у виртуально удаленной системы (файлы, веб-страницы и прочее).
HTTPS
HyperText Transfer Protocol Secure — расширение протокола HTTP для поддержки шифрования в целях повышения безопасности. Данные в протоколе HTTPS передаются поверх криптографических протоколов TLS или более старого SSL.
FTP
File Transfer Protocol – протокол передачи информации из особого файлового сервера на ПК конечного пользователя.
POP3, IMAP и SMTP
Протоколы для работы с электронной почтой.
POP3 (Post Office Protocol Version 3) и IMAP (Internet Message Access Protocol) отвечают за получение почты, SMTP (Simple Mail Transfer Protocol) – за отправку.
HTTP сообщения (детальнее)
HTTP сообщения - это обмен данными между сервером и клиентом. Есть два типа сообщений: запросы, отправляемые клиентом, чтобы инициировать реакцию со стороны сервера, и ответы от сервера.
Сообщения HTTP состоят из текстовой информации в кодировке ASCII, записанной в несколько строк.
HTTP запросы и ответы имеют близкую структуру. Они состоят из:
- Стартовой строки, описывающей запрос, или статус (успех или сбой). Это всегда одна строка.
- Произвольного набора HTTP заголовков, определяющих запрос или описывающих тело сообщения.
- Пустой строки, указывающей, что вся мета информация отправлена.
- Произвольного тела, содержащего пересылаемые с запросом данные (например, содержимое HTML-формы ) или отправляемый в ответ документ. Наличие тела и его размер определяется стартовой строкой и заголовками HTTP.
Запросы HTTP (Request)
Состоят из:
- Стартовая строка (start line)
- Загловки (headers)
- Тело (body) - может не быть
Ответы HTTP (Response)
Состоят из:
- Строка статуса (status line)
- Загловки (headers)
- Тело (body)
Методы HTTP запроса
Метод GET
Используется для запроса содержимого указанного ресурса. Например получить данные, файл или любую другую информацию, браузер при наборе url https://uk.wikipedia.org или http://www.example.com/index.html?id=1&name=value использует именно GET запрос, может передавать переменные в query параметре (в примере ?id=1&name=value это query параметры, начинается с символа ?, следующий параметр добавляется при помощи символа & в данном примере, параметр {‘id’: '1, ‘name’: ‘value’})
Обычно не используется для отправки данных, только для получения определенной информации. Например получение комментариев к посту в блоге.
Метод POST
Применяется для передачи пользовательских данных заданному ресурсу. Например, в блогах посетители обычно могут вводить свои комментарии к записям в HTML-форму, после чего они передаются серверу методом POST и он помещает их на страницу. При этом передаваемые данные (в примере с блогами — текст комментария) включаются в тело запроса. Аналогично с помощью метода POST обычно загружаются файлы на сервер. Может содержать много данных или файлов (или и то, и другое).
Метод PUT
Применяется для обновления данных по заданному ресурсу целиком, например, изменение комментария. Может содержать много данных или файлов (или и то и другое).
Метод PATCH
Почти аналогичен методу PUT, но применяется для частичного изменения объекта. Допустим изменения данных в профиле в соц сети, при изменении имейла, нам не нужно изменять весь профиль, только поле имейл. Может содержать много данных или файлов (или и то и другое).
Метод DELETE
Используется для удаления объектов, обычно не принимает данные, как и метод гет. Пример, все тот же комментарий.
Существуют и другие запросы, которые используют реже и с другими назначениями, их и более подробно эти запросы, мы рассмотрим на другом занятии.
Описанные запросы используют, для стандартных CRUD операций:
Create - POST, Retrieve - GET, Update - PUT/PATCH, Delete - DELETE
Коды ответа HTTP (детальнее)
Код ответа (состояния) HTTP показывает, был ли успешно выполнен определённый HTTP запрос. Коды сгруппированы в 5 классов:
- Информационные 100 - 199
- Успешные 200 - 299
- Перенаправления 300 - 399
- Клиентские ошибки 400 - 499
- Серверные ошибки 500 - 599
Шаблон проектирования MVC (Model-View-Controller)
MVC — это паттерн проектирования веб-приложений, который включает в себя 3 блока. При использовании MVC на три отдельных компонента разделены модель данных приложения, пользовательский интерфейс и логика взаимодействия пользователя с системой, благодаря чему модификация одного из этих компонентов оказывает минимальное воздействие на остальные или не оказывает его вовсе.
Основная цель применения MVC состоит в разделении данных и бизнес-логики от визуализации. За счет такого разделения повышается возможность повторного использования программного кода: например, добавить представление данных какого-либо существующего маршрута не только в виде HTML, но и в форматах JSON, XML, PDF, XLSX становится очень просто и не требует исменений слоя бизнес-логики исходного маршрута. Также упрощается и сопровождение программного кода: внесение изменений во внешний вид, например, не отражаются на бизнес-логике, а изменения бизнес-логики не затрагивают визуализацию.
Концепция MVC разделяет данные, представление и обработку действий пользователя на компоненты:
- Модель / Model — включает в себя данные и методы работы с этими данными, реагирует на запросы из контроллера, возвращая данные и/или изменяя своё состояние. При этом модель не содержит в себе информации о способах визуализации данных или форматах их представления, а также не взаимодействует с пользователем напрямую.
- Представление / View — отвечает за отображение информации (визуализацию). Одни и те же данные могут представляться различными способами и в различных форматах. Например, коллекцию объектов при помощи разных представлений можно представить на уровне пользовательского интерфейса как в табличном виде, так и списком; на уровне API можно экспортировать данные как в JSON, так в XML или XSLX.
- Контроллер / Controller — обеспечивает связь между пользователем и системой, использует модель и представление для реализации необходимой реакции на действия пользователя. Как правило, на уровне контроллера осуществляется фильтрация полученных данных и авторизация — проверяются права пользователя на выполнение действий или получение информации.
По этому же принципу работает и Django, но в немного измененной, только по терминам форме, паттерн называется MVT (Model - View - Template), где View играет роль контроллера, а Template роль отображения, но суть при этом сохраняется.
А есть ли другие паттерны?
Конечно, но это уже выходит за рамки программы.
Фреймворк vs Библиотека
Фреймворк (framework — остов, каркас, рама, структура) — программная платформа, определяющая структуру программной системы; программное обеспечение, облегчающее разработку и объединение разных компонентов большого программного проекта.
Библиотека (от англ. library) в программировании — сборник подпрограмм или объектов, используемых для разработки программного обеспечения (ПО). В Python то же, что и модуль.
«Фреймворк» отличается от понятия библиотеки тем, что библиотека может быть использована в программном продукте просто как набор подпрограмм близкой функциональности, не влияя на архитектуру программного продукта и не накладывая на неё никаких ограничений.
В то время как «фреймворк» диктует правила построения архитектуры приложения, задавая на начальном этапе разработки поведение по умолчанию — «каркас», который нужно будет расширять и изменять, согласно указанным требованиям.
Также, в отличие от библиотеки, которая объединяет в себе набор близкой функциональности, — «фреймворк» может содержать в себе вспомогательные программы, библиотеки кода, язык сценариев и другое ПО, облегчающее разработку и объединение разных компонентов большого программного проекта.
Монолитная vs Микросервисная архитектура
Что такое монолитная архитектура?
Монолитная архитектура рассматривается как традиционный метод разработки приложений. Приложение в монолитной архитектуре разрабатывается как единый пакет. Разработка нормального приложения начинается с модульной многоуровневой или шестиугольной архитектуры. Эта архитектура состоит из следующих типов слоев:
- Уровень представления. Это уровень графического интерфейса пользователя, который обрабатывает запросы протокола передачи гипертекста (HTTP) с использованием HTML или XML / JSON.
- Уровень бизнес-логики: бизнес-логика приложения присутствует на этом уровне.
- Уровень доступа к базе данных все обращения к базе данных, включая SQL и NoSQL приложений, происходят на этом уровне.
- Уровень интеграции приложений : все интеграции программного обеспечения с другими системами происходят на этом уровне.
Несмотря на то, что монолитная архитектура имеет логическую многоуровневую архитектуру, конечные приложения будут упакованы в один монолит и затем развернуты таким образом. Монолитным приложениям не хватает надлежащей модульности, и она имеет только одну кодовую базу.
Что такое микросервисная архитектура?
С другой стороны, микросервисная архитектура следует модульному подходу для разработки различных приложений. Микросервисная архитектура включает в себя набор небольших, независимых и автономных модулей, которые выполняют различные услуги. Каждый сервис должен иметь возможность самостоятельной реализации соответствующих бизнес-единиц.
Монолитная архитектура - это единое целое. Но в микросервисной архитектуре есть группа небольших независимых блоков, которые совместно работают как одно приложение. Все функциональные возможности приложения разбиты на отдельные и независимые развертываемые модули, которые взаимодействуют друг с другом с помощью методов, называемых интерфейсами прикладного программирования (API). Каждую из служб в архитектуре микросервисов можно легко масштабировать, развертывать и обновлять независимо.
Микросервисная архитектура - это слабо связанная архитектура, каждый компонент независим по отношению друг к другу. Для их кодирования можно использовать несколько языков программирования. Кроме того, они могут использовать другой тип хранения для хранения данных.
Что такое Django?
Джа́нго Ре́йнхардт (цыг. Django Reinhardt; настоящее имя Жан Рена́рт, фр. Jean Reinhardt; 23 января 1910 — 16 мая 1953) — французский джазовый гитарист-виртуоз, один из основателей стиля «джаз-мануш». Прозвище Рейнхардта «Django» на цыганском языке означает «я проснулся».
Django — это высокоуровневый Python веб-фреймворк, который позволяет быстро создавать безопасные и поддерживаемые веб-сайты. Созданный опытными разработчиками, Django берёт на себя большую часть хлопот веб-разработки, поэтому вы можете сосредоточиться на написании своего веб-приложения без необходимости изобретать велосипед. Он бесплатный и с открытым исходным кодом, имеет растущее и активное сообщество и отличную документацию.
Основной информационный ресурс Django.
Документация На английском офф и не офф перевод
Проект поддерживается организацией Django Software Foundation.
Один из основных принципов фреймворка — DRY (англ. Don’t repeat yourself)
Django был разработан в период с 2003 по 2005 год командой, которая занималась созданием и обслуживанием газетных веб-сайтов. После создания нескольких сайтов, команда начала повторно использовать множество общего кода и шаблонов проектирования. Этот общий код эволюционировал в веб-фреймворк, который превратился в проект “Django” с открытым исходным кодом в июле 2005 года.
Первый релиз (1.0) состоялся в сентябре 2008 года.
Django помогает писать программное обеспечение, которое будет:
Полным
Django следует философии «Всё включено» и предоставляет почти всё, что разработчики могут захотеть сделать «из коробки». Поскольку всё, что вам нужно, является частью единого «продукта», всё это безупречно работает вместе, соответствует последовательным принципам проектирования и имеет обширную и актуальную документацию.
Разносторонним
Django может быть (и был) использован для создания практически любого типа веб-сайтов — от систем управления контентом и wiki до социальных сетей и новостных сайтов. Он может работать с любой клиентской средой и может доставлять контент практически в любом формате (включая HTML, RSS-каналы, JSON, XML и т. д.).
Хотя Django предоставляет решения практически для любой функциональности, которая вам может понадобиться (например, для нескольких популярных баз данных, шаблонизаторов и т. д.), внутренне он также может быть расширен сторонними компонентами, если это необходимо.
Безопасным
Django помогает разработчикам избежать многих распространённых ошибок безопасности, предоставляя фреймворк, разработанный чтобы «делать правильные вещи» для автоматической защиты сайта. Например, Django предоставляет безопасный способ управления учётными записями пользователей и паролями, избегая распространённых ошибок, таких как размещение информации о сеансе в файлы cookie, где она уязвима (вместо этого файлы cookie содержат только ключ, а фактические данные хранятся в базе данных) или непосредственное хранение паролей вместо хэша пароля.
Хэш пароля — это значение фиксированной длины, созданное путём обработки пароля через криптографическую хэш-функцию. Django может проверить правильность введённого пароля, пропустив его через хэш-функцию и сравнив вывод с сохранённым значением хэша. Благодаря «одностороннему» характеру функции, даже если сохранённое хэш-значение скомпрометировано, злоумышленнику будет сложно определить исходный пароль.
Django, по умолчанию, обеспечивает защиту от многих уязвимостей, включая SQL-инъекцию, межсайтовый скриптинг, подделку межсайтовых запросов.
Масштабируемым
Django использует компонентную “shared-nothing” архитектуру (каждая её часть независима от других и, следовательно, может быть заменена или изменена, если это необходимо). Чёткое разделение частей означает, что Django может масштабироваться при увеличении трафика, путём добавления оборудования на любом уровне: серверы кеширования, серверы баз данных или серверы приложений. Одни из самых загруженных сайтов успешно масштабировали Django (например, Instagram и Disqus, если назвать только два из них).
Удобным в сопровождении
Код Django написан с использованием принципов и шаблонов проектирования, которые поощряют создание поддерживаемого и повторно используемого кода. В частности, в нём используется принцип «Don’t Repeat Yourself» (DRY, «не повторяйся»), поэтому нет ненужного дублирования, что сокращает объём кода. Django также способствует группированию связанных функциональных возможностей в повторно используемые «приложения» и, на более низком уровне, группирует связанный код в модули (в соответствии с шаблоном Model View Controller (MVC)).
Переносным
Django написан на Python, который работает на многих платформах. Это означает, что вы не привязаны к какой-либо конкретной серверной платформе и можете запускать приложения на многих версиях Linux, Windows и Mac OS X. Кроме того, Django хорошо поддерживается многими веб-хостингами, которые часто предоставляют определённую инфраструктуру и документацию для размещения сайтов Django.
Возможности Django
- ORM, API доступа к БД с поддержкой транзакций
- встроенный интерфейс администратора, с уже имеющимися переводами на многие языки
- диспетчер URL на основе регулярных выражений
- расширяемая система шаблонов с тегами и наследованием
- система кеширования
- интернационализация
- подключаемая архитектура приложений, которые можно устанавливать на любые Django-сайты
- «generic views» — шаблоны функций контроллеров
- авторизация и аутентификация, подключение внешних модулей аутентификации.
- система фильтров («middleware») для построения дополнительных обработчиков запросов, как например включённые в дистрибутив фильтры для кеширования, сжатия, нормализации URL и поддержки анонимных сессий
- библиотека для работы с формами (наследование, построение форм по существующей модели БД)
- встроенная автоматическая документация по тегам шаблонов и моделям данных, доступная через административное приложение
Сайты, работающие на фреймворке Django
История Django насчитывает уже около 10 лет. За этот период он использовался в продакшене на множестве топовых сайтов. Вот некоторые выдающиеся примеры:
Pinterest
Mozilla
Bitbucket
Udemy
The Onion
Disqus
Washington Post
NASA
Spotify
Instagram
National Geographic
The Guardian
JSFiddle
Архитектура Django
- URLs: Хотя можно обрабатывать запросы с каждого URL-адреса с помощью одной функции, гораздо удобнее писать отдельную функцию для обработки каждого ресурса. URL-маршрутизатор используется для перенаправления HTTP-запросов в соответствующее представление на основе URL-адреса запроса. Кроме того, URL-маршрутизатор может извлекать данные из URL-адреса в соответствии с заданным шаблоном и передавать их в соответствующую функцию отображения (view) в виде аргументов.
- View: это функция обработчика запросов, которая получает HTTP-запросы и возвращает ответы. Функция view имеет доступ к данным, необходимым для удовлетворения запросов, и делегирует ответы в шаблоны через модели.
- Models: Модели представляют собой объекты Python, которые определяют структуру данных приложения и предоставляют механизмы для управления (добавления, изменения, удаления) и выполнения запросов в базу данных.
- Templates: это текстовый файл, определяющий структуру или разметку страницы (например HTML-страницы), с полями для подстановки, которые используются для вывода актуального содержимого. View может динамически создавать HTML-страницы, используя HTML-шаблоны и заполняя их данными из модели (model). Шаблон может быть использован для определения структуры файлов любых типов, не обязательно HTML.
Версии
Установка Django
Создание виртуального окружения
python3 -m venv env
или
virtualenv -p python3 env
Если модуль отсутвсует, его придется установить.
Активация:
В Windows командой:
env\Scripts\activate.bat
В Linux или MacOS:
source env/bin/activate
Деактивация
deactivate
Установка
pip install django
Создание проекта
django-admin startproject mysite
Эта команда создаёт новый проект, и заполняет его базово нужными файлами, давайте рассмотрим их.
Структура файлов:
mysite /
manage.py
mysite /
asgi.py
__init__.py
settings.py
urls.py
wsgi.py
manage.py
- файл-утилита при помощи которого мы будем взаимодействовать со многими частями Django из консоли
Внутри папки mysite:
__init__.py
- Пустой файл, который говорит Python-у, что этот каталог должен рассматриваться как пакет Python-а
settings.py
- Настройки и конфигурации проекта.
urls.py
- URL-ы для этого проекта.
wsgi.py
- Web Server Gateway Interface стандарт взаимодействия между Python-программой, выполняющейся на стороне сервера, и самим веб-сервером.
Файл отвечающий за входную точку сервера - позволяет запускать код как сайт.
asgi.py
- Asynchronous Server Gateway Interface — клиент-серверный протокол взаимодействия веб-сервера и приложения, дальнейшее развитие технологии WSGI. По сравнению с WSGI предоставляет стандарт как для асинхронных, так и для синхронных приложений, с реализацией обратной совместимости WSGI и несколькими серверами и платформами приложений.
Проверим работоспособность.
В консоли запустим локальный “сервер” из папки с нашим “сайтом” (в моём примере mysite)
python manage.py runserver
Не закрывая консоль (сервер должен работать), открываем в браузере http://127.0.0.1:8000/
127.0.0.1
это локальный хост а :8000
это номер порта на котором запущен процесс. 127.0.0.1
можно заменить на 0.0.0.0
или слово localhost
, все три варианта практически взаимозаменяемы.
Если вы всё сделали правильно, то в браузере должны увидеть, что-то такое:
Создание приложения
Архитектура приложения подразумевает использование отдельных модулей как части сайта (бывает один на весь сайт, а бывают и тысячи), такие модули называются приложениями, и именно в них пишется “суть” сайта.
python manage.py startapp myapp
Команда создаст вам папку с вашим приложением, давайте разберем её подробнее
myapp/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
__init__.py
- пустой файл, который говорит Python-у, что этот каталог должен рассматриваться как пакет Python-а
admin.py
- заготовка под админку
apps.py
- информация о приложении (нужно при большом количестве приложений, для удобства)
migrations
- миграции базы данных.
models.py
- модели.
tests.py
- тесты.
views.py
- контроллер приложения.
Регистрация папки с приложением
После создания приложения нам нужно зарегистрировать его в проекте, чтобы различные утилиты затрагивали его своим действием (например при добавлении моделей в базу данных). Приложения регистрируются добавлением их названий в список INSTALLED_APPS
в настройках проекта (который, как мы помним, называется settings.py
).
Откройте файл settings.py
и найдите в нём список INSTALLED_APPS
. Затем добавьте новую строку в конец списка.
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp',
]
Сторонние приложения подключаются сюда же.
Urls
Для начала изменим файл views.py
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world!")
Для работы нашего приложения создаём дополнительный файл в папке с приложением и назовем его urls.py
myapp/urls.py
from django.urls import path
from .views import index
urlpatterns = [
path('', index, name='index'),
]
В файле с урлами создадим ссылку на урлы приложения
mysite/urls.py
from django.urls import include, path
urlpatterns = [
path('', include('myapp.urls')),
]
Теперь откроем наш “сайт” и введем в адресную строку http://127.0.0.1:8000/
Функция path()
path(route, view, kwargs=None, name=None)
Возвращает элемент для включения в urlpatterns
.
Конвертеры пути
По умолчанию доступны следующие конвертеры пути:
str
- соответствует любой непустой строке, за исключением разделителя пути, ‘/’. Это значение по умолчанию, если преобразователь не включен в выражение.int
- соответствует нулю или любому положительному целому числу. Возвращает int.slug
- соответствует любой строке заголовка, состоящей из букв или цифр ASCII, а также символов дефиса и подчеркивания. Например,build-your-1st-django-site
.uuid
- соответствует форматированному UUID. Чтобы предотвратить сопоставление нескольких URL-адресов с одной и той же страницей, необходимо использовать дефисы, а буквы должны быть строчными. Например,075194d3-6885-417e-a8a8-6c931e272f00
. Возвращает экземплярUUID
.path
- соответствует любой непустой строке, включая разделитель пути,'/'
. Это позволяет вам сопоставлять полный путь URL, а не сегмент пути URL, как в случае с str.
Применение path
Обновим наш urls.py
:
from django.urls import include, path
from myapp.views import index, main_article, uniq_article, article
urlpatterns = [
path('my_url/', include('myapp.urls')),
path('article/', main_article, name='mail_article'),
path('article/33/', uniq_article, name='uniq_article'),
path('article/<int:article_id>/', article, name='article'),
path('article/<int:article_id>/<slug:name>', article, name='article_name'),
path('', index, name='index'),
]
И добавим к myapp/views.py
:
def main_article(request):
return HttpResponse('There will be a list with articles')
def uniq_article(request):
return HttpResponse('This is uniq answer for uniq value')
def article(request, article_id, name=''):
return HttpResponse(
"This is an article #{}. {}".format(article_id, "Name of this article is {}".format(
name) if name else "This is unnamed article"))
Давайте разберём подробнее.
Мы описали два статических урла article/
и article/33/
и два динамических article/<int:article_id>/
и article/<int:article_id>/<slug:name>/
, причём в качестве обработчика динамических урлов, мы указали одну и туже функцию article
, в которой указали что будет приниматься два параметра article_id
и name
, и при этом name
не является обязательным, т.к. имеет значение по умолчанию.
Использование регулярных выражений
Если синтаксиса путей и преобразователей недостаточно для определения шаблонов URL-адресов, вы также можете использовать регулярные выражения. Для этого используйте re_path()
вместо path()
.
Также для обратной совместимости с django первой версии есть функция url, которая является просто ссылкой на re_path.
В регулярных выражениях Python для именованных групп регулярных выражений используется синтаксис (?P<name>pattern)
, где name
- имя группы, а pattern
- некоторый шаблон для сопоставления.
Вот пример URLconf из предыдущего, переписанный с использованием регулярных выражений:
from django.urls import path, re_path
from . import views
urlpatterns = [
path('articles/2003/', views.special_case_2003),
re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[\w-]+)/$', views.article_detail),
]
redirect()
from django.shortcuts import redirect
redirect(to, *args, permanent=False, **kwargs)
Возвращает HttpResponseRedirect
на соответствующий URL-адрес для переданных аргументов.
Аргументами могут быть:
- Модель: будет вызвана функция модели
get_absolute_url()
. - Имя представления, возможно с аргументами:
reverse()
, будет использоваться для обратного разрешения имени. - Абсолютный или относительный URL-адрес, который будет использоваться как есть для местоположения перенаправления.
По умолчанию выдает временное перенаправление; передайте permanent=True
, чтобы выполнить постоянное перенаправление.
Примеры
Вы можете использовать функцию redirect() разными способами.
- Передавая некоторый объект; будет вызван метод этого объекта
get_absolute_url()
для определения URL перенаправления:from django.shortcuts import redirect def my_view(request): ... obj = MyModel.objects.get(...) return redirect(obj)
- Путем передачи имени представления и, возможно, некоторых позиционных или ключевых аргументов; URL-адрес будет преобразован в обратном порядке с использованием метода
reverse()
:def my_view(request): ... return redirect('some-view-name', foo='bar')
- Передавая заданный URL-адрес для перенаправления на:
Это также работает с полными URL:def my_view(request): ... return redirect('/some/url/')
def my_view(request): ... return redirect('https://example.com/')
По умолчанию redirect()
возвращает временное перенаправление. Все вышеперечисленные формы принимают permanent
аргумент; если установлено значение True
, будет возвращено постоянное перенаправление:
def my_view(request):
...
obj = MyModel.objects.get(...)
return redirect(obj, permanent=True)
Дополнительно
- Настройка запуска django сервера в PyCharm
- Создание django проекта в PyCharm
Практика / Домашнее задание:
-
Научиться создавать и запускать django проект через консоль и PyCharm
-
Создать новый проект и новое приложение
-
Создать в нём всю необходимую структуру, для урлов
http://127.0.0.1:8000/
,
http://127.0.0.1:8000/acricles
,
http://127.0.0.1:8000/acrticles/archive
,
http://127.0.0.1:8000/users
-
Создать структуру для динамических урлов:
http://127.0.0.1:8000/article/<int:article_number>
,http://127.0.0.1:8000/article/<int:article_number>/archive
,http://127.0.0.1:8000/article/<int:article_number>/<slug:slug_text>
,http://127.0.0.1:8000/users/<int:user_number>
-
Создать урл который будет принимать в качестве параметра корректный номер украинского мобильного телефона, 0501231214 - корректно, 0751231212 - нет.
-
Создать урл который будет принимать параметр вида 4 символа от 1 до 9, или от a до f, знак дефиса и еще 6 символов, например
/34f1-1ac498/
Возвращать урлы, могут, всё что угодно, главное, что бы они работали.