Написание вашего первого приложения Django, часть 1
Давайте учиться на примерах.
В этом руководстве мы проведем вас через создание базового приложения опросов.
В него будут входить две части:
- Общедоступный сайт, который позволяет людям просматривать опросы и голосовать в них.
- Сайт администратора, который позволяет добавлять, изменять и удалять опросы.
Мы предполагаем, что у вас уже установлен Django. Вы можете узнать, установлен ли Django и какую версию вы используете, выполнив следующую команду:
$ python -m django --version
Если Django установлен, вы увидите версию вашей установки. Если нет, вы получите ошибку, сообщающую о том, что «модуль django не найден».
Это руководство написано для Django 1.9 и Python 3.4 или более поздних версий. Если версия Django не совпадает, вы можете обратиться к руководству для вашей версии Django, используя переключатель версий в правом нижнем углу этой страницы, или обновить Django до последней версии. Если вы по-прежнему используете Python 2.7, вам нужно будет немного изменить примеры кода, как описано в комментариях.
См. Как установить Django для получения советов по удалению старых версий Django и установке новой.
Где получить помощь:
Если у вас возникли трудности с этим руководством, отправьте сообщение на django-users или зайдите в #django на irc.freenode.net, чтобы поговорить с другими пользователями Django, которые могут помочь.
Создание проекта
Если вы впервые используете Django, вам нужно будет выполнить некоторые начальные настройки. В частности, вам нужно будет автоматически сгенерировать код, который создает проект Django проект – набор настроек для экземпляра Django, включая конфигурацию базы данных, специфичные для Django параметры и параметры, специфичные для приложения.
Из командной строки, cd в каталог, где вы хотите сохранить свой код, затем выполните следующую команду:
$ 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
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/wsgi.py: Точка входа для веб-серверов, совместимых с WSGI, для обслуживания вашего проекта. См. Как развернуть с помощью WSGI для получения дополнительных сведений.
Сервер разработки
Давайте проверим, работает ли ваш проект Django. Перейдите в внешний mysite каталог, если вы этого еще не сделали, и выполните следующие команды:
$ python 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. April 04, 2017 - 15:50:53 Django version 1.9, 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/ в браузере. Вы увидите страницу «Добро пожаловать в Django» в приятном светло-голубом пастельном цвете. Все работает!
Изменение порта
По умолчанию команда runserver запускает сервер разработки на внутреннем IP-адресе на порту 8000.
Если вы хотите изменить порт сервера, передайте его в качестве аргумента командной строки. Например, эта команда запускает сервер на порту 8080:
$ python manage.py runserver 8080
Если вы хотите изменить IP-адрес сервера, передайте его вместе с портом. Например, для прослушивания на всех общедоступных IP-адресах (что полезно, если вы хотите показать свою работу на других компьютерах в вашей сети), используйте:
$ python manage.py runserver 0.0.0.0:8000
Полная документация по серверу разработки находится в справке runserver.
Автоматическая перезагрузка runserver
Сервер разработки автоматически перезагружает код Python для каждого запроса по мере необходимости. Вам не нужно перезапускать сервер, чтобы изменения в коде вступили в силу. Однако некоторые действия, такие как добавление файлов, не запускают перезапуск, поэтому вам нужно будет перезапустить сервер в этих случаях.
Создание приложения Опросы
Теперь, когда ваша среда — «проект» — настроена, вы готовы приступить к работе.
Каждое приложение, которое вы пишете в Django, состоит из пакета Python, который следует определенному соглашению. Django поставляется с утилитой, которая автоматически генерирует базовую структуру каталогов приложения, чтобы вы могли сосредоточиться на написании кода, а не на создании каталогов.
Проекты против приложений
В чем разница между проектом и приложением? Приложение — это веб-приложение, которое выполняет определенные действия (например, система ведения блога, база данных общедоступных записей или простое приложение опросов). Проект — это набор конфигураций и приложений для определенного веб-сайта. Проект может содержать несколько приложений. Приложение может входить в состав нескольких проектов.
Ваши приложения могут находиться в любом месте на вашем пути поиска Python. В этом руководстве мы создадим наше приложение опросов рядом с файлом manage.py , чтобы его можно было импортировать как отдельный модуль верхнего уровня, а не как подмодуль mysite.
Чтобы создать ваше приложение, убедитесь, что вы находитесь в той же директории, что и manage.py, и введите эту команду:
$ python 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.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.index, name='index'),
]
Следующим шагом является указание корневого URLconf на модуль polls.urls. В mysite/urls.py, добавьте импорт для django.conf.urls.include и вставьте include() в список urlpatterns, так что у вас будет:
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^polls/', include('polls.urls')),
url(r'^admin/', admin.site.urls),
]
Функция include() позволяет ссылаться на другие URLconfs. Обратите внимание, что регулярные выражения для функции include() не имеют символа $ (совпадения с концом строки), а вместо этого имеют конечный слэш. Всякий раз, когда Django сталкивается с include(), она обрезает часть URL, которая соответствовала до этого момента, и отправляет оставшуюся строку включенному URLconf для дальнейшей обработки.
Идея, стоящая за include(), заключается в том, чтобы сделать подключение URL простым. Так как опросы находятся в собственном URLconf (polls/urls.py), их можно разместить под «/polls/», под «/fun_polls/», под «/content/polls/» или любой другой корневой частью пути, и приложение по-прежнему будет работать.
Когда использовать include()
Вы всегда должны использовать include() при включении других URL-шаблонов. admin.site.urls является единственным исключением из этого правила.
Не совпадает с тем, что вы видите?
Если вы видите include(admin.site.urls) вместо просто admin.site.urls, вероятно, вы используете версию Django, которая не соответствует версии этого учебника. Вам нужно будет либо переключиться на более старую версию учебника, либо на более новую версию Django.
Вы теперь подключили представление index к URLconf. Давайте проверим, работает ли это, выполнив следующую команду:
$ python manage.py runserver
Перейдите по адресу http://localhost:8000/polls/ в вашем браузере, и вы должны увидеть текст «Привет, мир. Вы находитесь на индексе опросов.», который вы определили в представлении index.
Функция url() принимает четыре аргумента, два обязательных: regex и view, и два необязательных: kwargs, и name. На этом этапе стоит пересмотреть назначение этих аргументов.
url() аргумент: regex
Термин «regex» — это общепринятое сокращение от «regular expression» (регулярное выражение), которое представляет собой синтаксис для сопоставления шаблонов в строках, или в данном случае, в шаблонах URL. Django начинает с первого регулярного выражения и продвигается по списку, сравнивая запрашиваемый URL с каждым регулярным выражением, пока не найдёт соответствие.
Обратите внимание, что эти регулярные выражения не ищут параметры GET и POST, а также имя домена. Например, в запросе к https://www.example.com/myapp/, URLconf будет искать myapp/. В запросе к https://www.example.com/myapp/?page=3, URLconf также будет искать myapp/.
Если вам нужна помощь с регулярными выражениями, обратитесь к статье Википедии и документации модуля re. Также отличной книгой является «Мастерство регулярных выражений» Джеффри Фридла (O’Reilly). Однако на практике вам не нужно быть экспертом в регулярных выражениях, так как вам достаточно знать, как захватывать простые шаблоны. Фактически, сложные регулярные выражения могут иметь низкую производительность поиска, поэтому, вероятно, вам не следует полагаться на всю мощь регулярных выражений.
Наконец, примечание о производительности: эти регулярные выражения компилируются при первом загрузке модуля URLconf. Они очень быстрые (пока запросы не слишком сложны, как указано выше).
url() аргумент: view
Когда Django находит соответствие по регулярному выражению, Django вызывает указанную функцию представления, с объектом HttpRequest в качестве первого аргумента и любыми «захваченными» значениями из регулярного выражения в качестве других аргументов. Если регулярное выражение использует простые захваты, значения передаются как позиционные аргументы; если оно использует именованные захваты, значения передаются как именованные аргументы. Мы приведём пример этого чуть позже.
url() аргумент: kwargs
Произвольные именованные аргументы могут быть переданы в виде словаря целевому представлению. Мы не будем использовать эту функцию Django в этом руководстве.
url() аргумент: имя
Именование вашего URL позволяет однозначно ссылаться на него из других частей Django, особенно из шаблонов. Эта мощная функция позволяет вносить глобальные изменения в шаблоны URL вашего проекта, затрагивая только один файл.
Когда вы освоитесь с базовым потоком запросов и ответов, прочитайте часть 2 этого руководства, чтобы начать работу с базой данных.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/1.9/intro/tutorial01/