Создание вашей первой Django-приложения, часть 1
Давайте учиться на примерах.
В этом руководстве мы пройдем вас через создание базового приложения опросов.
Оно будет состоять из двух частей:
- Публичный сайт, который позволяет пользователям просматривать опросы и голосовать в них.
- Сайт администрирования, который позволяет вам добавлять, изменять и удалять опросы.
Мы будем предполагать, что у вас уже установлен Django. Вы можете узнать, установлен ли Django и какую версию вы используете, выполнив следующую команду:
$ python -m django --version
Если Django установлен, вы должны увидеть версию вашей установки. Если нет, вы получите ошибку, сообщающую «Модуль django не найден».
Это руководство написано для Django 1.10 и 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. September 06, 2017 - 15:50:53 Django version 1.10, 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-код для каждого запроса по мере необходимости. Вам не нужно перезапускать сервер для того, чтобы изменения кода вступили в силу. Однако некоторые действия, такие как добавление файлов, не запускают перезапуск, поэтому в этих случаях вам придется перезапустить сервер.
Создание приложения Polls
Теперь, когда ваша среда — «проект» — настроена, вы готовы приступить к работе.
Каждое приложение, которое вы пишете в 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 в каталоге опросов создайте файл с именем 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() позволяет ссылаться на другие URLconf. Обратите внимание, что регулярные выражения для функции 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» — это общепринятое сокращение для «регулярного выражения», которое представляет собой синтаксис для сопоставления шаблонов в строках, или в данном случае, в шаблонах 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() аргумент: name
Именование URL позволяет однозначно ссылаться на него из других частей Django, особенно из шаблонов. Эта мощная функция позволяет вносить глобальные изменения в URL-паттерны вашего проекта, затрагивая только один файл.
Когда вы будете чувствовать себя уверенно с основным потоком запросов и ответов, прочитайте часть 2 этого руководства, чтобы начать работу с базой данных.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/1.10/intro/tutorial01/