Введение в Django 3 — Создаем REST API CRUD

В этом уроке для начинающих по 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 были добавлены следующие функции:

  1. Поддержка MariaDB: теперь Django официально поддерживает MariaDB 10.1+. Вы можете использовать MariaDB через бэкэнд MySQL,
  2. Поддержка ASGI для асинхронного программирования,
  3. Django 3.0 обеспечивает поддержку для работы в качестве приложения ASGI, что делает Django полностью асинхронным
  4. Ограничения исключения в PostgreSQL: Django 3.0 добавляет новый класс ExclusionConstraint, который добавляет ограничения исключения в PostgreSQL и т.д.

Что такое MVC?

MVC - это шаблон проектирования архитектуры программного обеспечения, который предполагет разделение функционала и эффективное сотрудничество между дизайнерами и разработчиками при работе над одним проектом. MVC предполагает разделение архитектуры вашего приложения минимум на три слоя:

  1. Model (Модель): отвечает за хранение и управление данными,
  2. View (Представление): отвечает за представление и отображение пользовательского интерфейса,
  3. Controller (Контроллер): отвечает за обработку логики для управления пользовательским интерфейсом и работы с моделью данных

Благодаря MVC вы, как разработчик, можете работать со слоем моделей и контроллеров, не заботясь о пользовательском интерфейсе (оставленном для дизайнеров), поэтому, если что-то изменится на стороне дизайнеров в пользовательском интерфейсе, вы можете быть уверены, что это не повлияет на другие слои приложения.

Причины использовать Django?

Из-за своей популярности и большого сообщества, Python имеет множество веб-фреймворков, среди которых и Django. Так что же делает Django отличным выбором для вашего следующего проекта?

Django представляет собой модульный веб-фреймворк

Django включает в себя набор модулей, которые можно использовать для решения распространенных проблем при разработке веб-приложения, таких как:

  1. Организация структура приложения,
  2. Система аутентификации,
  3. Генерация форм,
  4. ORM для абстрагирования запросов к СУБД,
  5. Шаблонизатор,
  6. Система кеширования,
  7. Генерации 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 и запустили локальный сервер разработки.