Создание первого приложения на Django, часть 1

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

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

Он будет состоять из двух частей:

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

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

$ python -m django --version
...\> py -m django --version

Если фреймворк Django установлен, вы увидите номер версии. Если нет, вы получите сообщение об ошибке «Нет модуля с именем django».

This tutorial is written for Django 4.1, which supports Python 3.8 and later. If the Django version doesn’t match, you can refer to the tutorial for your version of Django by using the version switcher at the bottom right corner of this page, or update Django to the newest version. If you’re using an older version of Python, check Какие версии Python можно использовать с Django? to find a compatible version of Django.

Смотрите Как установить Django, чтобы узнать как удалить старые версии Django и установить последнюю версию.

Где получить помощь:

Если у вас возникли проблемы с просмотром этого учебника, перейдите в раздел Получение справки FAQ.

Создание проекта

Если вы раньше Django не использовали, то необходимо позаботиться о начальной настройке. А именно, необходимо автоматически сгенерировать определенный код, который устанавливает Django project — набор настроек для конкретного экземпляра Django, включающий в себя конфигурацию базы данных, специфичные для Django опции специфичные настройки для приложения.

Выполните в терминале в командной строке cd: смену каталога на тот, в котором вы хотите хранить код проекта, затем запустите следующую команду:

$ django-admin startproject mysite
...\> django-admin startproject mysite

Это создаст каталог mysite в текущем каталоге. Если этого не произошло, то смотрите Проблемы с запуском django-admin.

Примечание

Не рекомендуется в качестве названия проекта названия встроенных компонентов Python или Django. Это значит, что следует избегать использования таких имен, как django (будет конфликт с самим фреймворком) или test (будет конфликтовать со стандартным пакетом Python).

Где этот код должен находится?

If your background is in plain old PHP (with no use of modern frameworks), you’re probably used to putting code under the web server’s document root (in a place such as /var/www). With Django, you don’t do that. It’s not a good idea to put any of this Python code within your web server’s document root, because it risks the possibility that people may be able to view your code over the web. That’s not good for security.

Размещайте свой код в каком-либо каталоге вне корневого каталога сервера, например /home/mycode.

Давайте посмотрим на результат выполнения команды startproject:

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py

Разберем, для чего нужны эти файлы и каталоги:

  • Внешний корневой каталог mysite/ — это контейнер для вашего проекта. Его имя не имеет значения для Джанго; Вы можете переименовать его на что угодно.
  • manage.py: утилита, позволяющая взаимодействовать с проектом различными способами. Вы можете прочитать все подробности о manage.py в django-admin и manage.py.
  • Внутренний каталог mysite/ это Python модуль вашего проекта. Его название вы будете использовать для импорта чего-либо из этого модуля (например, mysite.urls).
  • mysite/__init__.py: пустой файл, который сообщает Python, что этот каталог должен рассматриваться как пакет Python’а. Если вы новичок в Python, прочитайте больше о пакетах в официальной документации Python.
  • mysite/settings.py: Конфигурация и настройки проекта Django. В Настройки Django рассказано все о том, как работают настройки.
  • mysite/urls.py: указание URL проекта на 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.

декабря 29, 2022 - 15:50:53
Django version 4.1, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

Примечание

Пока игнорируйте предупреждение о непримененных миграциях базы данных; мы разберемся с базой данных в ближайшее время.

You’ve started the Django development server, a lightweight web server written purely in Python. We’ve included this with Django so you can develop things rapidly, without having to deal with configuring a production server – such as Apache – until you’re ready for production.

Now’s a good time to note: don’t use this server in anything resembling a production environment. It’s intended only for use while developing. (We’re in the business of making web frameworks, not web servers.)

Now that the server’s running, visit http://127.0.0.1:8000/ with your web browser. You’ll see a «Congratulations!» page, with a rocket taking off. It worked!

Смена порта

По умолчанию команда runserver запускает сервер разработки на внутреннем IP адресе с портом 8000.

Для смены порта передайте его аргументом в командной строке. Например, эта команда запускает сервер на порту 8080:

$ python manage.py runserver 8080
...\> py manage.py runserver 8080

Для изменения IP адреса сервера, передайте его вместе с портом. Например, чтобы использовать все доступные публичные IP-адреса (что полезно, если вы работаете с Vagrant или хотите показать свою работу на других компьютерах в сети), используйте:

$ python manage.py runserver 0.0.0.0:8000
...\> py manage.py runserver 0.0.0.0:8000

Full docs for the development server can be found in the runserver reference.

Автоматическая перезагрузка runserver

Сервер разработки автоматически перезагружает код Python для каждого запроса по мере необходимости. Вам не нужно перезагружать сервер, чтобы изменения в коде вступили в силу. Однако некоторые действия, такие как добавление файлов, в эти условия не входят, поэтому вам придется перезапустить сервер в этих случаях.

Создание приложения Polls

Теперь, когда ваше окружение - «проект» - настроено, вы можете приступить к дальнейшей работе.

Каждое приложение, которое вы пишете в Django, состоит из пакета Python, который следует определенному соглашению. Django поставляется с утилитой, которая автоматически генерирует базовую структуру каталогов приложения, поэтому вы можете сосредоточиться на написании кода, а не на создании каталогов.

Проекты и приложения

What’s the difference between a project and an app? An app is a web application that does something – e.g., a blog system, a database of public records or a small poll app. A project is a collection of configuration and apps for a particular website. A project can contain multiple apps. An app can be in multiple projects.

Ваши приложения могут находиться где угодно в вашем пути 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

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

Написание первого представления

Давайте напишем первое представление (view). Откройте файл polls/views.py и вставьте в него следующий код Python:

polls/views.py
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 добавьте следующий код:

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`, у вас должно получиться так:

mysite/urls.py
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]

Функция include() позволяет ссылаться на другие URLconfs. Всякий раз, когда 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/, вы должны увидеть текст «Hello, world. You’re at the polls index.», который вы определили в представлении 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 вашего проекта, касаясь только одного файла.

Когда вы освоитесь с основами запросов и ответов, прочитайте вторую часть этого руководства, чтобы начать работу с базой данных.

Вернуться на верх