Почему Django?
Django (Джанго) — свободный фреймворк для веб-приложений на языке Python, использующий шаблон проектирования MVC. Проект поддерживается организацией Django Software Foundation.
Веб-фреймворк Django используется в сайтах Instagram, Disqus, Mozilla, The Washington Times, Pinterest, YouTube, Google и др.
Django на сегодняшний день, без сомнения, является одним из самых популярных веб фреймворков Python.
Пожалуй лучшей иллюстрацией возможностей этого фреймворка может послужить Instagram, созданный на Django в 2010 г. и проданный Facebook в 2012 г. за $1 млрд.
Для корректной установки Django в начале нужно созадать папку проекта (латиницей). Затем в созданную папку установить Django и pipenv посредством утилиты pip, поставляемой в составе Python и выполняющей установку дополнительных библиотек из интернет-репозитория PyPI. Запустим командную строку и введем в ней такую команду:
pip install pipenv
pipenv install Django
pipenv shell
Создадим новый, пока еще пустой проект Django, которому дадим имя samplesite. Для этого в запущенной ранее командной строке перейдем в папку, в которой должна находиться папка проекта, и отдадим команду:
django-admin startproject samplesite .
Пакет конфигурации включает в себя такие модули:
__init__.py
settings.py
urls.py
wsgi.py
asgi.py
(начиная с Django 3.0)В состав Django входит отладочный веб-сервер, написанный на самом языке Python. Чтобы запустить его, следует в командной строке перейти непосредственно в папку проекта и отдать команду:
python manage.py runserver
Приложение в терминологии Django — это отдельный фрагмент функциональности разрабатываемого сайта, более или менее независимый от других таких же фрагментов и входящий в состав проекта.
Новое приложение создается следующим образом: Сначала остановим отладочный веб-сервер. В командной строке проверим, находимся ли мы в папке проекта, и наберем команду:
python manage.py startapp bboard
Команда startapp утилиты manage.py
запускает создание нового приложения, имя которого указано после этой команды.
Зарегистрируем только что созданное приложение в проекте. Найдем в пакете конфигурации файл settings.py, откроем его в текстовом редакторе и отыщем следующий фрагмент кода:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
Список, хранящийся в переменной installed apps
, перечисляет все приложения, зарегистрированные в проекте и участвующие в его работе.
Добавим приложение bboard, включив в список новый элемент:
INSTALLED_APPS = [
...
'bboard.apps.BboardConfig',
]
Мы указали строку с путем к классу BboardConfig, описывающему конфигурацию приложения и объявленному в модуле apps.py пакета приложения bboard.
Контроллер Django (он же view или представление) — это код, запускаемый при обращении по интернет-адресу определенного формата и в ответ выводящий на экран определенную веб-страницу. Контроллер Django может представлять собой как функцию (контроллер-функция), так и класс (контроллер-класс).
Откроем модуль views.py
пакета приложения bboard, удалим имеющийся там небольшой код и заменим его следующим кодом:
from django.http import HttpResponse
def index(request):
return HttpResponse("Здесь будет выведен список объявлений.")
Любой контроллер-функция в качестве единственного обязательного параметра принимает экземпляр класса HttpRequest, хранящий различные сведения о полученном запросе: запрашиваемый интернет-адрес, данные, полученные от посетителя, служебную информацию от самого веб-обозревателя и пр. По традиции этот параметр называется request.
В теле функции мы создаем экземпляр класса HttpResponse
(он объявлен в модуле django.http
), который будет представлять ответ, отправляемый клиенту. Содержимое этого ответа указываем единственным параметром конструктора этого класса. Готовый экземпляр класса возвращаемв качестве результата.
При поступлении любого запроса от клиента Django выделяет из запрашиваемого интернет-адреса путь, который передает маршрутизатору. Последний последовательно сравнивает его с шаблонными путями из списка маршрутов. Как только будет найдено совпадение, маршрутизатор передает управление контроллеру, связанному с совпавшим шаблонным путем.
Откроем модуль urls.py
в текстовом редакторе и посмотрим, что он содержит:
from django.contrib import admin
from django.urls import path
urlpatterns = [
path ('admin/', admin.site.urls),
]
Список маршрутов, оформленный в виде обычного списка Python, присваивается переменной urlpatterns
. Каждый элемент списка маршрутов (т.е. каждый маршрут) должен представляться в виде результата, возвращаемого функцией path()
из модуля django.urls
. Последняя в качестве параметров принимает строку с шаблонным путем и ссылку на контроллер-функцию.
Добавим в список новый маршрут, связывающий шаблонный путь bboard/
и контроллер-функцию index()
. Для чего дополним имеющийся в модуле urls.py
следующий код:
from django.contrib import admin
from django.urls import path
from bboard.views import index
urlpatterns = [
path('bboard/', index),
path('admin/', admin.site.urIs),
]
Маршрутизатор Django при просмотре списка маршрутов не требует, чтобы путь, полученный из клиентского запроса (реальный), и шаблонный путь, записанный в очередном маршруте, совпадали полностью. Достаточно лишь того факта, что шаблонный путь совпадает с началом реального.
Начнем со списка маршрутов уровня приложения bboard. Создадим в пакете этого приложения (т. е. в папке bboard) файл urls.py и занесем в него следующий код:
from django.urls import path
from .views import index
urlpatterns = [
path('', index),
]
Наконец, исправим код модуля urls.py из пакета конфигурации.
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path(`bboard/`, include(`bboard.urls`)),
path(`admin/`, admin.site.urls),
]
Вложенный список маршрутов, указываемый во втором параметре функции path(), должен представлять собой результат, возвращенный функцией include () из модуля django.urls. В качестве единственного параметра эта функция принимает строку с путем к модулю, где записан вложенный список маршрутов.