UNIXAWESOME

Django. Создать и запустить проект

Aug. 28, 2021

django-logo.png

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

Нам необходим Python, чем свежее, тем лучше. Если его нет в системе, то устанавливаем

Далее устанавливаем virtualenv.

Virtualenv — это утилита, которая позволяет создавать изолированные виртуальные окружения для Python.

pip install virtualenv

Создаём виртуальное окружение c указанием конкретной версии Python.

virtualenv -p /sbin/python3.9 venv

Название папки venv может быть любым. Чаще всего используют это или .venv чтобы папка была скрытой.

Активация окружения. Для активация окружения переходим в папку с проектом где создано окружение и выполняем:

source venv/bin/activate

Обновляем менеджер пакетов pip

python -m pip install --upgrade pip

Устанавливаем Django

pip install django

Создаём проект

django-admin startproject mysite

В каталоге mysite создаётся структура будущего приложения.

mysite
  ├── db.sqlite3
  ├── manage.py
  └── mysite
      ├── asgi.py
      ├── __init__.py
      ├── __pycache__
      │   ├── __init__.cpython-39.pyc
      │   ├── settings.cpython-39.pyc
      │   ├── urls.cpython-39.pyc
      │   └── wsgi.cpython-39.pyc
      ├── settings.py
      ├── urls.py
      └── wsgi.py
  • __init__.py - это пустой файл, который указывает Python рассматривать этот каталог как пакет Python.
  • settings.py содержит все настройки веб-сайта, включая регистрацию любых создаваемых нами приложений, расположение наших статических файлов, сведения о конфигурации базы данных и т. д.
  • urls.py определяет сопоставление URL-адресов сайта и просмотра.
  • wsgi.py используется, чтобы помочь приложению Django взаимодействовать с веб-сервером.
  • asgi.py - это стандарт для асинхронных веб-приложений и серверов Python для взаимодействия друг с другом. ASGI является асинхронным преемником WSGI и обеспечивает стандарт как для асинхронных, так и для синхронных приложений Python (тогда как WSGI предоставил стандарт только для синхронных приложений).

Скрипт manage.py используется для создания приложений, работы с базами данных и запуска веб-сервера разработки.

Запускаем сервер

cd mysite
python manage.py runserver

Для просмотра переходим в браузере http://127.0.0.1:8000/

django-server.png

Всё просто.

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

Теперь создаём приложение блог, которое будет внутри нашего проекта mysite. Необходимо запускать эту команду из той же папки, что и manage.py вашего проекта:

python manage.py startapp blog

Структура проекта должна стать примерно такой:

mysite
├── blog
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── db.sqlite3
├── manage.py
└── mysite
    ├── asgi.py
    ├── __init__.py
    ├── __pycache__
    │   ├── __init__.cpython-39.pyc
    │   ├── settings.cpython-39.pyc
    │   ├── urls.cpython-39.pyc
    │   └── wsgi.cpython-39.pyc
    ├── settings.py
    ├── urls.py
    └── wsgi.py

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

Окрываем settings.py и редактируем:

...
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Наше приложение блог
    'blog',
]
...

Настройка базы данных

Здесь необходимо указать базу данных, которая будет использоваться для проекта.

По умолчанию используется sqlite3. Дополнительно про настройку базы можно почитать здесь https://docs.djangoproject.com/en/3.1/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

Другие настройки проекта

Необходимо указать часовой пояс

TIME_ZONE = 'Europe/London'

Есть еще два параметра, о которых следует знать:

  • SECRET_KEY. Это секретный ключ, который используется для безопасности веб-сайта Django.
  • DEBUG. Этот параметр позволяет отображать журналы отладки при ошибке, а не ответы с кодом состояния HTTP. На боевом сервере должно быть установлено значение False, поскольку отладочная информация полезна для злоумышленников, но пока идёт разработка сайта мы можем оставить True.

При старте сервера нас просят применить миграции к базе. Сделаем это.

python manage.py migrate

Теперь создадим свой первый url на сайте http://127.0.0.1:8000/. Для этого в файл mysite/urls.py добавить строку. И он будет выглядеть как то так:

from django.contrib import admin
from django.urls import path, include

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

Django теперь будет перенаправлять все запросы ‘http://127.0.0.1:8000' к blog.urls и искать там дальнейшие инструкции.

Создаём новый пустой файл blog/urls.py. И добавляем в него следующие две строки:

from django.urls import path
from . import views

После этого мы можем добавить наш первый URL-шаблон:

urlpatterns = [
    path('', views.post_list, name='post_list'),
]

Теперь создадим нашу первую вьюху. В файле blog/views напишем:

def post_list(request):
    return render(request, 'blog/post_list.html', {})

Дальше создадим шаблон для нашей вьюхи. В папке blog делаем папку templates и в ней паку blog и там файл post_list.html.
Должен получится такой путь к шаблону: mysite/blog/templates/blog/post_list.html

<html>
    <p>Django!</p>
    <p>It works!</p>
</html>

Перезапускаем наш сервер и заходим http://127.0.0.1:8000
Как видим страница изменилась. Вот таким способом создаётся основная структура.

Пробуйте у вас должно получится)