Написание вашего первого приложения Django, часть 1
Давайте учиться на примерах.
В этом руководстве мы покажем вам, как создать базовое приложение опросов.
Оно будет состоять из двух частей:
- Общедоступный сайт, который позволяет пользователям просматривать опросы и голосовать в них.
- Сайт администратора, который позволяет добавлять, изменять и удалять опросы.
Мы будем предполагать, что у вас уже установлен Django. Вы можете проверить установку Django и её версию, выполнив следующую команду в командной строке (обозначается префиксом $):
$ python -m django --version
...\> py -m django --version
Если Django установлен, вы увидите версию вашей установки. Если нет, вы получите ошибку, указывающую на то, что «модуль django не найден».
Это руководство написано для Django 3.1, которое поддерживает Python 3.6 и более поздние версии. Если версия Django не совпадает, вы можете обратиться к руководству для вашей версии Django, используя переключатель версий в правом нижнем углу этой страницы, или обновить Django до последней версии. Если вы используете более старую версию Python, ознакомьтесь с Какой версии Python можно использовать с Django?, чтобы найти совместимую версию Django.
См. Как установить Django за советом о том, как удалить старые версии Django и установить новую.
Где получить помощь:
Если у вас возникнут трудности с этим руководством, обратитесь к разделу Получение помощи в разделе часто задаваемых вопросов.
Создание проекта
Если это ваш первый опыт с Django, вам нужно выполнить некоторые начальные настройки. В частности, вам потребуется автоматически сгенерировать некоторый код, который создаёт проект Django – набор настроек для экземпляра Django, включая конфигурацию базы данных, специфичные для Django опции и настройки, специфичные для приложения.
Из командной строки, перейдите cd в каталог, где вы хотите хранить свой код, а затем выполните следующую команду:
$ django-admin startproject mysite
...\> django-admin startproject mysite
Это создаст каталог mysite в текущем каталоге. Если это не сработало, см. Проблемы с запуском django-admin.
Примечание
Необходимо избегать именования проектов по встроенным компонентам Python или Django. В частности, это означает, что вы не должны использовать имена, такие как django (что создаст конфликт с самим Django) или test (что создаст конфликт со встроенным пакетом Python).
Где должен находиться этот код?
Если у вас опыт работы с обычным PHP (без использования современных фреймворков), вы, вероятно, привыкли размещать код в корневом каталоге веб-сервера (например, в /var/www). В Django делается иначе. Не рекомендуется размещать какой-либо из этого кода Python в корневом каталоге вашего веб-сервера, так как это может привести к тому, что люди смогут просматривать ваш код через веб. Это небезопасно.
Разместите свой код в каталоге вне корня документа, например, /home/mycode.
Давайте посмотрим, что startproject создал:
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
Эти файлы:
- Внешний каталог
mysite/– контейнер для вашего проекта. Его имя не имеет значения для Django; вы можете переименовать его как угодно. -
manage.py: Утилита командной строки, позволяющая взаимодействовать с этим проектом Django различными способами. Вы можете прочитать все подробности оmanage.pyв django-admin и manage.py. - Внутренний каталог
mysite/– фактический пакет Python для вашего проекта. Его имя – это имя пакета Python, которое вам потребуется использовать для импорта чего-либо внутри него (например,mysite.urls). -
mysite/__init__.py: Пустой файл, который сообщает Python, что этот каталог следует рассматривать как пакет Python. Если вы новичок в Python, прочитайте подробнее о пакетах в официальной документации Python. -
mysite/settings.py: Настройки/конфигурация для этого проекта Django. Настройки Django расскажут вам все о том, как работают настройки. -
mysite/urls.py: Объявления URL для этого проекта Django; «оглавление» вашего сайта на основе Django. Вы можете узнать больше о URL в Диспечер URL. -
mysite/asgi.py: Точка входа для ASGI-совместимых веб-серверов для обслуживания вашего проекта. См. Как развернуть с ASGI для получения более подробной информации. -
mysite/wsgi.py: Точка входа для WSGI-совместимых веб-серверов для обслуживания вашего проекта. См. Как развернуть с WSGI для получения более подробной информации.
Сервер разработки
Давайте проверим, работает ли ваш проект Django. Перейдите во внешний каталог mysite (если ещё не сделали) и выполните следующие команды:
$ python manage.py runserver
...\> py manage.py runserver
Вы увидите следующий вывод в командной строке:
Performing system checks... System check identified no issues (0 silenced). You have unapplied migrations; your app may not work properly until they are applied. Run 'python manage.py migrate' to apply them. November 14, 2020 - 15:50:53 Django version 3.1, using settings 'mysite.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.
Примечание
Пока проигнорируйте предупреждение о не применённых миграциях базы данных; мы скоро займёмся базой данных.
Вы запустили сервер разработки Django, лёгкий веб-сервер, написанный полностью на Python. Мы включили его с Django, чтобы вы могли быстро разрабатывать вещи, не беспокоясь о настройке сервера для производства (например, Apache), пока не будете готовы к производству.
Сейчас хорошее время отметить: не используйте этот сервер в условиях, приближающихся к производственной среде. Он предназначен только для использования во время разработки. (Мы занимаемся созданием фреймворков для веб, а не веб-серверов.)
Теперь, когда сервер запущен, посетите http://127.0.0.1:8000/ в своем браузере. Вы увидите страницу «Поздравляем!», с взлетающей ракетой. Всё работает!
Изменение порта
По умолчанию команда runserver запускает сервер разработки по внутреннему IP-адресу на порту 8000.
Если вы хотите изменить порт сервера, передайте его как аргумент командной строки. Например, эта команда запускает сервер на порту 8080:
$ python manage.py runserver 8080
...\> py manage.py runserver 8080
Если вы хотите изменить IP-адрес сервера, передайте его вместе с портом. Например, чтобы прослушивать все доступные публичные IP-адреса (что полезно, если вы используете Vagrant или хотите продемонстрировать свою работу другим компьютерам в сети), используйте:
$ python manage.py runserver 0:8000
...\> py manage.py runserver 0:8000
0 – это сокращение для 0.0.0.0. Полная документация по серверу разработки находится в runserver.
Автоматическая перезагрузка runserver
Сервер разработки автоматически перезагружает код Python для каждого запроса по мере необходимости. Вам не нужно перезапускать сервер, чтобы изменения кода вступили в силу. Однако некоторые действия, такие как добавление файлов, не запускают перезапуск, поэтому в этих случаях потребуется перезапустить сервер.
Создание приложения Polls
Теперь, когда ваша среда – «проект» – настроена, вы можете начать работу.
Каждое приложение, которое вы пишете в Django, представляет собой пакет Python, который следует определённой схеме. Django поставляется с утилитой, которая автоматически генерирует базовую структуру каталогов приложения, поэтому вы можете сосредоточиться на написании кода, а не на создании каталогов.
Проекты и приложения
В чём разница между проектом и приложением? Приложение – это веб-приложение, которое делает что-то – например, систему веб-журнала, базу данных общедоступных записей или небольшое приложение опросов. Проект – это набор конфигураций и приложений для определённого веб-сайта. Проект может содержать несколько приложений. Приложение может быть частью нескольких проектов.
Ваши приложения могут находиться где угодно в вашей пути поиска Python. В этом руководстве мы создадим наше приложение опросов в том же каталоге, что и файл manage.py, чтобы его можно было импортировать как самостоятельный модуль верхнего уровня, а не подмодуль mysite.
Чтобы создать своё приложение, убедитесь, что вы находитесь в том же каталоге, что и файл manage.py, и введите эту команду:
$ python manage.py startapp polls
...\> py manage.py startapp polls
Это создаст каталог polls, который организован так:
polls/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
Эта структура каталогов будет хранить приложение опросов.
Напишите свой первый вид
Давайте напишем первый вид. Откройте файл polls/views.py и поместите в него следующий код Python:
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")
Это самый простой возможный вид в Django. Чтобы вызвать вид, нам нужно сопоставить его с URL – и для этого нам нужен URLconf.
Чтобы создать URLconf в каталоге polls, создайте файл с именем urls.py. Ваш каталог приложения теперь должен выглядеть так:
polls/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
urls.py
views.py
В файле polls/urls.py включите следующий код:
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
Следующим шагом является указание корневого URLconf на модуль polls.urls. В mysite/urls.py, добавьте импорт для django.urls.include и вставьте include() в список urlpatterns, так что у вас будет:
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls),
]
Функция include() позволяет ссылаться на другие URLconf. Всякий раз, когда Django сталкивается с include(), она отсекает ту часть URL, которая совпала до этого момента, и отправляет оставшуюся строку включенному URLconf для дальнейшей обработки.
Идея, стоящая за include(), заключается в том, чтобы легко подключать и использовать URL-адреса. Поскольку опросы находятся в собственном URLconf (polls/urls.py), их можно разместить под «/polls/», или под «/fun_polls/», или под «/content/polls/», или под любым другим корневым путем, и приложение по-прежнему будет работать.
Когда использовать include()
Вы всегда должны использовать include() при включении других URL-шаблонов. admin.site.urls — единственное исключение из этого правила.
Вы теперь подключили представление index в URLconf. Проверьте его работу с помощью следующей команды:
$ python manage.py runserver
...\> py manage.py runserver
Перейдите по адресу http://localhost:8000/polls/ в вашем браузере, и вы должны увидеть текст «Привет, мир. Вы находитесь на странице опросов.», который вы определили в представлении index.
Страница не найдена?
Если вы получаете ошибку здесь, проверьте, что вы переходите по адресу http://localhost:8000/polls/, а не по адресу http://localhost:8000/.
Функция path() принимает четыре аргумента, два обязательных: route и view, и два необязательных: kwargs, и name. На этом этапе стоит рассмотреть назначение этих аргументов.
path() аргумент: route
route — это строка, содержащая шаблон URL. При обработке запроса Django начинает с первого шаблона в urlpatterns и проходит по списку, сравнивая запрашиваемый URL с каждым шаблоном, пока не найдет соответствующий.
Шаблоны не ищут параметры GET и POST, или имя домена. Например, в запросе к https://www.example.com/myapp/, URLconf будет искать myapp/. В запросе к https://www.example.com/myapp/?page=3, URLconf также будет искать myapp/.
path() аргумент: view
Когда Django находит соответствующий шаблон, он вызывает указанную функцию представления с объектом HttpRequest в качестве первого аргумента и любыми «захваченными» значениями из маршрута в качестве ключевых аргументов. Мы немного позже приведем пример этого.
path() аргумент: kwargs
Произвольные ключевые аргументы могут быть переданы в целевое представление в виде словаря. В данном руководстве мы не будем использовать эту функцию Django.
path() аргумент: name
Наименование вашего URL-адреса позволяет однозначно ссылаться на него из других частей Django, особенно из шаблонов. Эта мощная функция позволяет внести глобальные изменения в шаблоны URL вашего проекта, изменив только один файл.
Когда вы освоитесь с основным потоком запроса и ответа, прочитайте часть 2 этого руководства, чтобы начать работу с базой данных.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/3.1/intro/tutorial01/