В этом уроке для начинающих по Django 3 вы научитесь создавать веб-приложения на Python и Django. Этот урок не предполагает никакого предшествующего опыта работы с Django, поэтому мы рассмотрим основные концепции и элементы структуры Django, акцентируя внимание на практической теории.
По сути, мы собираемся разобрать фундаментальные концепции Django при создании простого веб-приложения CRM.
Вы узнаете о CRUD, базе данных ORM, как создавать представления API и URL-адреса.
Что такое Django?
Django - это основанный на Python веб-фреймворк с открытым исходным кодом для быстрого создания веб-приложений.
Это прагматичный фреймворк, разработанный для разработчиков, работающих над проектами со строгими сроками исполнения. Он идеально подходит для быстрого создания как прототипов, так и весьма мощных веб-приложений. Он соответствует шаблону проектирования Model View Controller (MVC) Django использует язык Python — универсальный, мощный и многофункциональный язык программирования.
Особенности Django 3
В Django 3 были добавлены следующие функции:
- Поддержка MariaDB: теперь Django официально поддерживает MariaDB 10.1+. Вы можете использовать MariaDB через бэкэнд MySQL,
- Поддержка ASGI для асинхронного программирования,
- Django 3.0 обеспечивает поддержку для работы в качестве приложения ASGI, что делает Django полностью асинхронным
- Ограничения исключения в PostgreSQL: Django 3.0 добавляет новый класс ExclusionConstraint, который добавляет ограничения исключения в PostgreSQL и т.д.
Что такое MVC?
MVC - это шаблон проектирования архитектуры программного обеспечения, который предполагет разделение функционала и эффективное сотрудничество между дизайнерами и разработчиками при работе над одним проектом. MVC предполагает разделение архитектуры вашего приложения минимум на три слоя:
- Model (Модель): отвечает за хранение и управление данными,
- View (Представление): отвечает за представление и отображение пользовательского интерфейса,
- Controller (Контроллер): отвечает за обработку логики для управления пользовательским интерфейсом и работы с моделью данных
Благодаря MVC вы, как разработчик, можете работать со слоем моделей и контроллеров, не заботясь о пользовательском интерфейсе (оставленном для дизайнеров), поэтому, если что-то изменится на стороне дизайнеров в пользовательском интерфейсе, вы можете быть уверены, что это не повлияет на другие слои приложения.
Причины использовать Django?
Из-за своей популярности и большого сообщества, Python имеет множество веб-фреймворков, среди которых и Django. Так что же делает Django отличным выбором для вашего следующего проекта?
Django представляет собой модульный веб-фреймворк
Django включает в себя набор модулей, которые можно использовать для решения распространенных проблем при разработке веб-приложения, таких как:
- Организация структура приложения,
- Система аутентификации,
- Генерация форм,
- ORM для абстрагирования запросов к СУБД,
- Шаблонизатор,
- Система кеширования,
- Генерации RSS
Джанго ORM
Django имеет мощный ORM (Object Relational Mapper), который позволяет разработчикам использовать классы и методы ООП Python вместо намисания запросов к таблицам БД. Благодаря Django ORM разработчики могут работать с любой системой баз данных, такой как MySQL или PostgresSQL, не зная ничего о SQL. В то же время ORM не мешает использовать SQL при необходимости. Вы можете написать собственный SQL запроса если это понадобится, особенно если вам нужно оптимизировать запросы к базе данных вашего сервера для повышения производительности.
Поддержка интернационализации: i18n
Вы можете использовать Django для написания мультиязычного веб-приложения благодаря мощной поддержке интернационализации.
Админпанель
Django является очень подходящей средой для быстрого создания прототипов веб-приложений благодаря автоматически генерируемому интерфейсу администратора.
Вы можете создать полноценную панель администратора, которое можно использовать для выполнения всевозможных операций CRUD с вашими моделями баз данных, которые вы зарегистрировали в модуле администратора, используя несколько строк кода.
Сообщество и подробная документация
У Django есть замечательное сообщество, которое подарило Django всевозможные удивительные вещи - от учебных пособий и книг до многократно используемых пакетов с открытым исходным кодом, которые расширяют базовую инфраструктуру и включают решения для еще большего числа проблем веб-разработки.
Если вы ищете веб-фреймворк, полный функционала, который делает создание веб-приложений увлекательным и простым и в котором есть все, что вы можете ожидать от современного фреймворка, то Django - это правильный выбор для вас, если вы знаете Python.
Установка Python
В зависимости от вашей операционной системы вам может понадобиться или не потребоваться установка Python. В Linux и MAC OS Python включен по умолчанию. Вам может потребоваться только обновить его, если установленная версия устарела.
Установка Python в Windows
Python по умолчанию не устанавливается в Windows, поэтому вам нужно скачать официальный установщик с официального сайта Python по адресу http://www.python.org/download/. Затем запустите программу установки и следуйте указаниям мастера, чтобы установить Python, как и любую другую программу Windows.
Также обязательно добавьте корневую папку Python в переменную среды системного пути, чтобы вы могли запустить исполняемый файл Python из любого каталога с помощью командной строки.
Затем откройте командную строку и введите python. Вам должна быть представлена интерактивная оболочка Python, печатающая текущую версию Python и предлагающая вам ввести команды Python (Python - интерпретируемый язык)
Установка Python в Linux
Если вы используете систему Linux, есть большая вероятность, что у вас уже установлен Python, но у вас может быть старая версия. В этом случае вы можете очень легко обновить его через свой терминал в зависимости от вашего дистрибутива Linux.
Для дистрибутивов на основе Debian, таких как Ubuntu, вы можете использовать менеджер пакетов apt
$ sudo apt-get install python
Это обновит вашу версию Python до последней доступной версии.
Для других дистрибутивов Linux вы должны искать эквивалентные команды для установки или обновления Python, что не является сложной задачей, если вы уже используете менеджер пакетов для установки пакетов в вашей системе, то вы должны выполнить тот же процесс для установки или обновления Python.
Установка Python на MAC OS
Как и Linux, Python по умолчанию включен в MacOS, но если у вас есть старая версия, вы можете обновить ее, перейдя по адресу http://www.python.org/download/mac/ и загрузив установщик Python для MacOS.
Теперь, если вам удалось установить или обновить Python в собственной системе или вы убедились, что в вашей системе уже установлена обновленная версия Python.
Установка PIP
PIP - это менеджер пакетов Python, который используется для установки пакетов Python из индекса пакетов Python, который является более продвинутым, чем easy_install
менеджер пакетов Python по умолчанию, который устанавливается вместе с Python.
Вы должны использовать PIP вместо easy_install
всякий раз, когда это возможно, но для установки самого PIP вы должны использовать easy_install
.
Откройте свой терминал и введите:
$ sudo easy_install pip
Теперь вы можете установить Django в вашей системе, используя pip
$ sudo pip install django
Хотя вы можете сделать это для установки Django, выполнять эту команду глобально в вашей системе настоятельно не рекомендуется. Вместо этого вам нужно использовать виртуальную среду для установки пакетов. Ниже описывается то, как установить Django в виртуальной среде.
Cоздание виртуальной среды (venv)
Откройте новый терминал, перейдите в рабочую папку и выполните следующую команду:
$ cd ~/demos
$ python3 -m venv .env
Затем активируйте виртуальную среду с помощью следующей команды:
$ source .env/bin/activate
На этом этапе нашего руководства мы создали виртуальную среду для нашего проекта Django. Теперь перейдем к созданию нашего проекта.
Установка Django и Django REST Framework
Теперь, когда вы создали и активировали свою виртуальную среду, вы можете устанавливать пакеты Python, используя pip. В вашем терминале, где вы активировали виртуальную среду, выполните следующие команды для установки необходимых пакетов:
$ pip install django
$ pip install djangorestframework
Вам также нужно будет установить клиент MySQL для Python, используя pip:
$ pip install mysqlclient
Создание базы данных MySQL
Для того чтобы создать базу данных MySQL для вашего приложения, в терминале вызовите клиент mysql
, используя следующую команду:
$ mysql -u root -p
Затем введите свой пароль MySQL и нажмите Enter
. Затем выполните следующую команду SQL для создания базы данных:
mysql> create database crmdb;
Создание проекта Django
Теперь давайте приступим к созданию нашего проекта django. В вашем терминале выполните следующую команду:
$ django-admin startproject simplecrm
Эта команда позаботится о создании набора необходимых файлов для проекта. После выполнения данной команды в корне вашего проекта появятся следующие файлы:
.
├── simplecrm
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
файл __init__ - это способ Python пометить содержащую папку как пакет Python, что означает, что проект Django является пакетом Python.
settings.py - это файл конфигурации проекта. Вы можете использовать этот файл, чтобы указать все параметры конфигурации вашего проекта, такие как установленные приложения, язык сайта и параметры базы данных и т.д.
urls.py - это специальный файл Django, который отображает все URL вашего веб-приложения в представления.
wsgi.py необходим для запуска сервера приложений wsgi.
manage.py - еще одна утилита Django для управления проектом, включая создание базы данных и запуск локального сервера разработки.
Это основные файлы, которые вы найдете в каждом проекте Django. Следующим шагом является настройка доступа к базе данных.
Откройте файл settings.py и обновите настройки базы данных, чтобы они указывали на нашу базу данных crmdb
:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'crmdb',
'USER': 'root',
'PASSWORD': 'YOUR_DB_PASSWORD',
'HOST': 'localhost',
'PORT': '3306',
}
}
Затем добавьте rest_framework
в массив INSTALLED_APPS
:
INSTALLED_APPS = [
# [...]
'rest_framework'
]
Наконец, запустите мигратор базы данных с помощью следующих команд:
$ cd simplecrm
$ python manage.py migrate
Как в Django создать пользователя-администратора?
Давайте создадим администратора с помощью следующей команды:
$ python manage.py createsuperuser
Создание нового приложения в проекте Django
Теперь создадим приложение Django для инкапсуляции нашего основного функционала CRM. В вашем терминале выполните следующую команду:
$ python manage.py startapp crmapp
Далее вам нужно добавить его в файл settings.py:
INSTALLED_APPS = [
# ...
'rest_framework',
'crmapp'
]
Создание моделей базы данных в Django
Теперь перейдем к созданию моделей базы данных для нашего приложения. Мы планируем создать следующие модели для нашей мини-crm:
- Contact
- Account
- Activity
- ContactStatus
- ContactSource
- ActivityStatus
У нас есть три основные модели: Contact (Контакт), Account (Учетная запись) и Activity (Активность). Последние три модели являются просто справочными таблицами.
Откройте файл crmapp/models.py
и напишите следующий код:
from django.db import models
from django.contrib.auth.models import User
INDCHOICES = (
('FINANCE', 'FINANCE'),
('HEALTHCARE', 'HEALTHCARE'),
('INSURANCE', 'INSURANCE'),
('LEGAL', 'LEGAL'),
('MANUFACTURING', 'MANUFACTURING'),
('PUBLISHING', 'PUBLISHING'),
('REAL ESTATE', 'REAL ESTATE'),
('SOFTWARE', 'SOFTWARE'),
)
class Account(models.Model):
name = models.CharField("Name of Account", "Name", max_length=64)
email = models.EmailField(blank = True, null = True)
phone = models.CharField(max_length=20, blank = True, null = True)
industry = models.CharField("Industry Type", max_length=255, choices=INDCHOICES, blank=True, null=True)
website = models.URLField("Website", blank=True, null=True)
description = models.TextField(blank=True, null=True)
createdBy = models.ForeignKey(User, related_name='account_created_by', on_delete=models.CASCADE)
createdAt = models.DateTimeField("Created At", auto_now_add=True)
isActive = models.BooleanField(default=False)
def __str__(self):
return self.name
class ContactSource(models.Model):
status = models.CharField("Contact Source", max_length=20)
def __str__(self):
return self.status
class ContactStatus(models.Model):
status = models.CharField("Contact Status", max_length=20)
def __str__(self):
return self.status
class Contact(models.Model):
first_name = models.CharField("First name", max_length=255, blank = True, null = True)
last_name = models.CharField("Last name", max_length=255, blank = True, null = True)
account = models.ForeignKey(Account, related_name='lead_account_contacts', on_delete=models.CASCADE, blank=True, null=True)
email = models.EmailField()
phone = models.CharField(max_length=20, blank = True, null = True)
address = models.TextField(blank=True, null=True)
description = models.TextField(blank=True, null=True)
createdBy = models.ForeignKey(User, related_name='contact_created_by', on_delete=models.CASCADE)
createdAt = models.DateTimeField("Created At", auto_now_add=True)
isActive = models.BooleanField(default=False)
def __str__(self):
return self.first_name
class ActivityStatus(models.Model):
status = models.CharField("Activity Status", max_length=20)
def __str__(self):
return self.status
class Activity(models.Model):
description = models.TextField(blank=True, null=True)
createdAt = models.DateTimeField("Created At", auto_now_add=True)
contact = models.ForeignKey(Contact, on_delete=models.CASCADE, blank=True, null=True)
def __str__(self):
return self.description
Создание сериализаторов моделей
После создания моделей нам нужно создать сериализаторы. В папке crmapp
создайте файл serializers.py
:
$ cd crmapp
$ touch serializers.py
Затем откройте этот файл и добавьте следующие импорты:
from rest_framework import serializers
from .models import Account, Activity, ActivityStatus, Contact, ContactSource, ContactStatus
Затем добавьте класс сериализатора для каждой модели:
class AccountSerializer(serializers.ModelSerializer):
class Meta:
model = Account
fields = "__all__"
class ActivitySerializer(serializers.ModelSerializer):
class Meta:
model = Activity
fields = "__all__"
class ActivityStatusSerializer(serializers.ModelSerializer):
class Meta:
model = ActivityStatus
fields = "__all__"
class ContactSerializer(serializers.ModelSerializer):
class Meta:
model = Contact
fields = "__all__"
class ContactSourceSerializer(serializers.ModelSerializer):
class Meta:
model = ContactSource
fields = "__all__"
class ContactStatusSerializer(serializers.ModelSerializer):
class Meta:
model = ContactStatus
fields = "__all__"
Создание API для представлений
После создания сериализаторов моделей создадим API для представлений. Откройте файл crmapp/views.py
и добавьте следующие импорты:
from rest_framework import generics
from .models import Account, Activity, ActivityStatus, Contact, ContactSource, ContactStatus
from .serializers import AccountSerializer, ActivitySerializer, ActivityStatusSerializer, ContactSerializer, ContactSourceSerializer, ContactStatusSerializer
Далее добавьте следующие views:
from rest_framework import generics
from .models import Account, Activity, ActivityStatus, Contact, ContactSource, ContactStatus
from .serializers import AccountSerializer, ActivitySerializer, ActivityStatusSerializer, ContactSerializer, ContactSourceSerializer, ContactStatusSerializer
class AccountAPIView(generics.ListCreateAPIView):
queryset = Account.objects.all()
serializer_class = AccountSerializer
class ActivityAPIView(generics.ListCreateAPIView):
queryset = Activity.objects.all()
serializer_class = ActivitySerializer
class ActivityStatusAPIView(generics.ListCreateAPIView):
queryset = ActivityStatus.objects.all()
serializer_class = ActivitySerializer
class ContactAPIView(generics.ListCreateAPIView):
queryset = Contact.objects.all()
serializer_class = ContactSerializer
class ContactStatusAPIView(generics.ListCreateAPIView):
queryset = ContactStatus.objects.all()
serializer_class = ContactSerializer
class ContactSourceAPIView(generics.ListCreateAPIView):
queryset = ContactSource.objects.all()
serializer_class = ContactSourceSerializer
Далее вам необходимо сгенерировать миграции с помощью следующей команды:
$ python manage.py makemigrations
Затем вам нужно выполнить миграции:
$ python manage.py migrate
Создание URL-адресов для API
Давайте теперь создадим URL-адреса API для доступа к нашим представлениям API. Откройте файл urls.py
и добавьте следующие импорты:
from django.contrib import admin
from django.urls import path
from crmapp import views
Затем добавьте следующий код:
urlpatterns = [
path('admin/', admin.site.urls),
path(r'accounts', views.AccountAPIView.as_view(), name='account-list'),
path(r'contacts', views.ContactAPIView.as_view(), name='contact-list'),
path(r'activities', views.ActivityAPIView.as_view(), name='activity-list'),
path(r'activitystatuses', views.ActivityStatusAPIView.as_view(), name='activity-status-list'),
path(r'contactsources', views.ContactSourceAPIView.as_view(), name='contact-source-list'),
path(r'contactstatuses', views.ContactStatusAPIView.as_view(), name='contact-status-list')
]
Как включить CORS в Django?
В целях разработки нам нужно включить CORS (Cross Origin Resource Sharing) в нашем приложении Django.
Итак, начните с установки django-cors-headers
с помощью pip
$ pip install django-cors-headers
Далее вам нужно добавить его в файл settings.py
:
INSTALLED_APPS = (
## [...]
'corsheaders'
)
Затем необходимо добавить промежуточное программное обеспечение corsheaders.middleware.CorsMiddleware
к классам middleware
в settings.py
MIDDLEWARE = (
'corsheaders.middleware.CorsMiddleware',
# [...]
)
Затем вы можете включить CORS для всех доменов, добавив следующий параметр:
CORS_ORIGIN_ALLOW_ALL = True
Запуск локального сервера разработки для Django
Django имеет локальный сервер разработки, который можно использовать при разработке вашего проекта. Это простой и примитивный сервер, который подходит только для разработки, а не для полноценного использования.
Чтобы запустить локальный сервер для вашего проекта, вы можете выполнить следующую команду в корневом каталоге вашего проекта:
$ python manage.py runserver
Затем перейдите по адресу http://localhost:8000/ с помощью веб-браузера.
Вы должны увидеть веб-страницу с сообщением:
It worked!
Подведем итоги. Мы создали новый проект Django, создали базу данных MySQL, создали REST API для мини CRM с каркасом Django REST и запустили локальный сервер разработки.