Spec-Zone.ru › Django 1.11

Написание вашей первой Django-приложения, часть 1

Давайте учиться на примерах.

В этом руководстве мы проведем вас через создание базового приложения опросов.

В него будут входить две части:

  • Публичный сайт, позволяющий пользователям просматривать опросы и голосовать в них.
  • Админ-сайт, позволяющий добавлять, изменять и удалять опросы.

Мы предполагаем, что у вас уже установлен Django. Вы можете узнать, установлен ли Django и какую версию вы используете, выполнив следующую команду в командной строке (обозначается префиксом $):

$ python -m django --version

Если Django установлен, вы увидите версию вашей установки. Если нет, вы получите ошибку, сообщающую «Модуль django не найден».

Это руководство написано для Django 1.11 и 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.

March 04, 2020 - 15:50:53
Django version 1.11, 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-адреса (что полезно, если вы используете Vagrant или хотите показать свою работу на других компьютерах в сети), используйте:

$ python 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

Это создаст директорию 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() позволяет ссылаться на другие 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/.

Если вам нужна помощь с регулярными выражениями, обратитесь к статье Википедии Wikipedia’s entry и документации модуля 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.11/intro/tutorial01/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API