owned this note
owned this note
Published
Linked with GitHub
# Основы Python Django
---
Почему 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 в начале нужно созадать папку проекта (латиницей). Затем в созданную папку установить 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
----
Приложение в терминологии 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
----
Контроллер Django (он же view или представление) — это код, запускаемый при обращении по интернет-адресу определенного формата и в ответ выводящий на экран определенную веб-страницу. Контроллер Django может представлять собой как функцию (контроллер-функция), так и класс (контроллер-класс).
----
Откроем модуль `views.py` пакета приложения bboard, удалим имеющийся там небольшой код и заменим его следующим кодом:
```
from django.http import HttpResponse
def index(request):
return HttpResponse("Здесь будет выведен список объявлений.")
```
----
Любой контроллер-функция в качестве единственного обязательного параметра принимает экземпляр класса HttpRequest, хранящий различные сведения о полученном запросе: запрашиваемый интернет-адрес, данные, полученные от посетителя, служебную информацию от самого веб-обозревателя и пр. По традиции этот параметр называется request.
----
В теле функции мы создаем экземпляр класса `HttpResponse` (он объявлен в модуле `django.http`), который будет представлять ответ, отправляемый клиенту. Содержимое этого ответа указываем единственным параметром конструктора этого класса. Готовый экземпляр класса возвращаемв качестве результата.
---
## Маршрутизатор Django
----
При поступлении любого запроса от клиента 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. В качестве единственного параметра эта функция принимает строку с путем к модулю, где записан вложенный список маршрутов.