Разработка сайтов в Москве. Как создать прототип веб-приложения с помощью Django и Vue.js

Было бы здорово, если бы вы могли создать прототип пользовательского веб-приложения, которое было бы отзывчивым (готовым для мобильных устройств), реактивным (быстродействующим) с полнофункциональным интерфейсом администратора для управления контентом — и все это в кратчайшие сроки? На самом деле, используя Django и Vue.js, вы можете! 😁

0. Введение: разработка полного стека 101

Я расскажу, как создать прототип пользовательского веб-приложения, и, чтобы сделать его как можно более кратким и понятным, контекстная информация здесь будет довольно краткой. Тем не менее, я предоставлю — надеюсь — достаточно ресурсов, чтобы вы знали, куда обращаться, если вам понадобится дополнительная информация.

С этой целью я полностью объединим управление данными, представление и маршрутизацию между Django и Vue.js — так что будьте готовы!

О Джанго

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

О Vue.js

То же самое и с Vue.js, прогрессивной средой JavaScript, доступной, универсальной и производительной. Если вы не знакомы с ним, здесь вы получите быстрое и грязное введение.

Я также расскажу о двух официальных библиотеках Vue.js:

Vue Router для отображения маршрута/представления

Vuex для управления состоянием

Python + JavaScript = ПОБЕДА!

В этой статье мы настроим проект публикации с базовой схемой базы данных для сохранения authorsи articles, а также с минимальным пользовательским интерфейсом (UI) для взаимодействия с ними.

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

1. Настройка проекта Django

Очень быстро настроим проект с нуля. Если вы уже знаете, как работать с проектами Django, вы можете пропустить этот раздел. Предположим, что у вас уже установлен Python.

Более подробное руководство см. в разделе Как установить Django на сайте документации Django.

Виртуальная среда Python

Давайте откроем консоль и создадим виртуальную среду (дополнительную информацию см. в разделе Виртуальные среды в Python Made Easy):

$ virtualenv myenvironment

Using base prefix 'c: \\users\\luzdealba\\appdata\\local\\programs\\python\\python37'

New python executable in C: \Users\luzdealba\Development\myenvironment\Scripts\python.exe

Installing setuptools, pip, wheel...

done

Не обращайте внимания на пути, так как они будут меняться от системы к системе.

Давайте получим доступ и активируем виртуальную среду.

В Windows:

$ cd myenvironment

$ Scripts\activate

В macOS и Linux:

$ cd myenvironment

$ source bin/activate

Пакет Джанго

Давайте установим Джанго:

(myenvironment) $ pip install django

Collecting django

Downloading Django-3.0.3-py3-none-any.whl (7.5 MB)

Collecting sqlparse≥0.2.2

Downloading sqlparse-0.3.1-py2.py3-none-any.whl (40 kB)

Collecting pytz

Using cached pytz-2019.3-py2.py3-none-any.whl (509 kB)

Collecting asgiref≈3.2

Downloading asgiref-3.2.3-py2.py3-none-any.whl (18 kB)

Installing collected packages: sqlparse, pytz, asgiref, django

Successfully installed asgiref-3.2.3 django-3.0.3 pytz-2019.3 sqlparse-0.3.1

Еще раз, не обращайте внимания на версии программ и размеры файлов, так как они могут различаться.

Проект

Давайте начнем проект под названием myproject:

(myenvironment) $ django-admin startproject myproject

Давайте получим доступ к проекту:

(myenvironment) $ cd myproject

Приложение

Запустите приложение под названием myapp:

(myenvironment) $ django-admin startapp myapp

И добавьте myapp.apps.MyappConfigв INSTALLED_APPSпостоянный список myproject/settings.py, чтобы включить приложение.

2. Настройка базы данных с помощью Django

Здесь мы определим внутреннюю базу данных с помощью Django, которую позже интегрируем с внешним хранилищем с помощью Vuex.

Джанго Модели

Модели — это способ Django для реализации объектно-реляционной системы управления базами данных (ORDBMS). Другими словами, простые текстовые файлы, в которых вы можете определять таблицы и поля базы данных и откуда они будут распространяться на прикладной уровень и механизм БД.

Давайте закодируем следующие модели для нашего приложения в myapp/models.py:

from django.db import models

class Article (models.Model):

«„„Table schema to store articles.““»

name = models.CharField (max_length=64)

author = models.ForeignKey ('myapp.Author’, on_delete=models.CASCADE)

content = models.TextField ()

slug = models.CharField (default='', max_length=64)

def __str__ (self):

return '%s’% self.name

class Author (models.Model):

«„„Table schema to store auhtors.““»

name = models.CharField (max_length=64)

slug = models.CharField (default='', max_length=64)

def __str__ (self):

return '%s’% self.name

Обратите внимание, что мы внедрили URL-слаг как для статей, так и для авторов.

Дополнительные сведения см. в справочнике по Model API на сайте документации Django.

Джанго Админ

Прежде чем мы сможем управлять этими моделями через административный сайт, нам сначала нужно registerих сделать, чтобы Django сделал их доступными для нас.

Давайте просто отредактируем myapp/admin.pyтак, чтобы это выглядело так:

from django.contrib import admin

from.models import Article

from.models import Author

# register models to use in admin site

admin.site.register (Article)

admin.site.register (Author)

Узнайте больше о сайте администрирования Django на сайте документации Django.

Джанго Миграции

Из документации Django Migrations:

Миграции — это способ Django распространять изменения, которые вы вносите в свои модели (добавление поля, удаление модели и т. д.), в схему вашей базы данных.

Короче говоря: миграции делают все; SQL-команды не требуются.

Во-первых, давайте создадим файлы миграции:

(myenvironment) $ python manage.py makemigrations

Migrations for 'myapp’:

myapp\migrations\0001_initial.py

— Create model Author

— Create model Article

Теперь воспользуемся этой информацией для обновления базы данных:

(myenvironment) $ python manage.py migrate

Operations to perform:

Apply all migrations: admin, auth, contenttypes, myapp, sessions

Running migrations:

Applying contenttypes. 0001_initial... OK

Applying auth. 0001_initial... OK

Applying admin. 0001_initial... OK

Applying admin. 0002_logentry_remove_auto_add... OK

Applying admin. 0003_logentry_add_action_flag_choices... OK

Applying contenttypes. 0002_remove_content_type_name... OK

Applying auth. 0002_alter_permission_name_max_length... OK

Applying auth. 0003_alter_user_email_max_length... OK

Applying auth. 0004_alter_user_username_opts... OK

Applying auth. 0005_alter_user_last_login_null... OK

Applying auth. 0006_require_contenttypes_0002... OK

Applying auth. 0007_alter_validators_add_error_messages... OK

Applying auth. 0008_alter_user_username_max_length... OK

Applying auth. 0009_alter_user_last_name_max_length... OK

Applying auth. 0010_alter_group_name_max_length... OK

Applying auth. 0011_update_proxy_permissions... OK

Applying myapp. 0001_initial... OK

Applying sessions. 0001_initial... OK

Не обращайте внимания на длинный список. Это потому, что это была наша первая миграция, поэтому были созданы не только наши таблицы Authorи Article, но и все схемы Django по умолчанию.

Дополнительные сведения см. в разделе Операции миграции на сайте документации Django.

3. Базовый интерфейс с компонентами Vue в шаблоне Django

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

Джанго Вью

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

Мы закодируем следующее представление в myapp/views.py:

from django.shortcuts import render

from.models import Article

from.models import Author

def frontend (request):

«„„Vue.js will take care of everything else.““»

articles = Article.objects.all ()

authors = Author.objects.all ()

data = {

'articles’: articles,

'authors’: authors,

}

return render (request, 'myapp/template.html’, data)

Обратите внимание, что мы запросили все статьи и авторов из базы данных. Это пригодится позже.

Дополнительные сведения о написании представлений и представлений на основе классов (API) см. на сайте документации Django.

Шаблон Джанго

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

Однако мы будем использовать шаблон Bootstrap Starter, чтобы установить очень простой макет навигации для приложения:

светло-серый фон

белый передний план

содержимое по центру

Итак, мы закодируем следующий шаблон myapp/templates/myapp/template.html (вам нужно будет создать подкаталоги templates/myapp/внутри myapp/):

<! doctype html>

Prototyping a Web App with Django and Vue.js

Подробнее о шаблонах Django.

Шаблоны Vue.js

Vue.js также имеет доступный синтаксис шаблона и, кроме того, позволяет нам создавать собственные HTML-теги.

Мы создадим четыре шаблона: article-list, author-list, article-itemиauthor-item:

Авария

Что мы сделали здесь, в двух словах:

Рендеринг списка с v-for.

Привязка данных в атрибутах HTML с помощью v-bind.

Условный рендеринг с v-ifиv-else.

Рендеринг необработанного HTML с помощью v-html.

$storeи $routeбудет иметь больше смысла, когда мы представим хранилище и маршрутизацию.

Интерполяция текста между шаблонами Django и Vue.js

Как и в случае с Django, наиболее простой формой интерполяции текста в Vue.js является синтаксис «усы» (двойные фигурные скобки).

Как это:

Message: {{ msg }}

Чтобы избежать конфликтов между ними, при создании экземпляра Vue.js мы настроим его на использование двойных квадратных скобок:

delimiters: ['[[', ']]']

Темы Vue.js

Знаете ли вы, что можете «темировать» Vue.js?

Встраиваемые темы для Vue.js

Vuetify.js, фреймворк компонента Material Design

BootstrapVue, компоненты Bootstrap и система сетки для Vue.js

Buefy, легкие компоненты пользовательского интерфейса для Vue.js на основе Bulma

Element UI — библиотека компонентов для разработчиков, дизайнеров и продакт-менеджеров.

Vue Material, Material Design и Vue.js

Quasar Framework, высокопроизводительный пользовательский интерфейс Vue.js

Компоненты Vue.js

Компоненты — это многократно используемые экземпляры Vue. Это означает, что мы можем определить компонент, создать для него HTML-шаблон, а затем использовать его столько раз, сколько нам нужно, а Vue.js обрабатывает DOM за нас.

В конце мы покажем весь код одностраничного приложения (SPA). А пока давайте представим несколько фрагментов.

Как и в случае с шаблонами, мы определим четыре компонента — ArticleList, AuthorList, ArticleItemи AuthorItem:

ArticleList = Vue.component ('article-list’, {

data: function () { return { articles: store.state.articles } },

template: '#article-list-template’,

}) ;

AuthorList = Vue.component ('author-list’, {

data: function () { return { authors: store.state.authors } },

template: '#author-list-template’,

}) ;

ArticleItem = Vue.component ('article-item’, {

delimiters: ['[[', ']]'],

props: ['name’, 'slug’, 'content’],

template: '#article-item-template’,

}) ;

AuthorItem = Vue.component ('author-item’, {

delimiters: ['[[', ']]'],

props: ['name’, 'slug’],

template: '#author-item-template’,

}) ;

Авария

В компоненте dataдолжна быть функция ($storeсейчас будет объяснено).

Мы используем ранее определенные шаблоны.

Чтобы устранить неоднозначность интерполяции текста, убедитесь, что вы установили delimitersотличные от Django ({{/ }}).

Мы используем propslist в качестве массива для передачи данных нашим компонентам.

4. Подключение магазина Vue.js для сбора базы данных Django с помощью Vuex

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

Вот где Vuex пригодится:

Он служит централизованным хранилищем для всех компонентов приложения с правилами, гарантирующими, что состояние может изменяться только предсказуемым образом.

Создание магазина Vuex

Давайте создадим и определим хранилище в нашем шаблоне Django и воспользуемся данными, доступными в представлении Django:

const store = new Vuex.Store ({

state: {

authors: [

{% for author in authors%}

{

name: '{{ author.name }}',

slug: '{{ author.slug }}',

},

{% endfor%}

],

articles: [

{% for article in articles%}

{

content: '{{ article.content | linebreaksbr }}',

name: '{{ article.name }}',

slug: '{{ article.slug }}',

},

{% endfor%}

],

},

getters: {

getArticleBySlug: (state) => (slug) => {

return state.articles.find (articles => articles.slug === slug)

},

getAuthorBySlug: (state) => (slug) => {

return state.authors.find (authors => authors.slug === slug)

},

}

})

Авария

Давайте рассмотрим, что только что произошло:

Мы создали магазин с использованием Vuex.Store ().

Мы определили состояние Vuex, в котором собраны все символы articlesи authors.

Мы использовали forцикл, встроенный в шаблоны Django, для перебора всех articlesи authors.

Мы создали два геттера Vuex для получения статьи или автора по их слагу getArticleBySlugи getAuthorBySlug, соответственно.

Vuex — это еще многое другое, поэтому обязательно ознакомьтесь с руководством по началу работы и справочником по API.

5. Маршрутизация URL-адресов между Django и Vue Router

В Django есть мощный диспетчер URL, который мы будем использовать в сочетании с маршрутизацией Vue.js.

Мы создадим приложение, которое:

использует динамическое сопоставление маршрутов для беспрепятственного переключения между страницами без обновлений (см. пример)

работает с вложенными маршрутами (см. пример)

С Джанго

Реактивные URL-адреса обычно требуют специальной конфигурации на сервере для правильной работы, но Django позволяет нам создавать URL-адреса так, как мы хотим, поэтому нет необходимости устанавливать правила перезаписи для Apache или NGINX.

Мы отредактируем myproject/urls.pyтак, чтобы он использовал базовый каталог /в качестве маршрута для нашего приложения:

from django.contrib import admin

from django.urls import path

# don’t forget to import the app’s view!

from myapp import views as myapp_views

urlpatterns = [

path ('admin/', admin.site.urls),

# paths for our app

path ('', myapp_views.frontend),

path ('article//', myapp_views.frontend),

path ('author//', myapp_views.frontend),

]

С маршрутизатором Vue

По умолчанию Vue Router использует «режим хеширования» (то есть: http: //site/#/path) в качестве трюка JavaScript для загрузки частей страницы с использованием привязок. Однако мы будем использовать режим истории HTML5 Vue Router, что означает, что все наши URL-адреса будут меняться плавно, без перезагрузки страницы и без использования хэшей.

Мы настроим маршрутизатор так, чтобы он соответствовал каждому пути к соответствующему ранее определенному компоненту:

const routes = [

{ component: ArticleList, path: '/article/', },

{ component: AuthorList, path: '/author/', },

{ component: ArticleItem, path: '/article/: slug/', },

{ component: AuthorItem, path: '/author/: slug/', },

]

const router = new VueRouter ({

mode: 'history’,

routes: routes,

})

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

Узнайте больше о маршрутизаторе Vue.

6. Тестирование всего

Теперь, когда мы собрали все части вместе, пришло время провести тестирование серого ящика и посмотреть, как все работает!

Создайте суперпользователя Django

Прежде чем мы сможем войти в систему администратора, нам нужно создать суперпользователя.

Создадим администратора:

(myenvironment) $ python manage.py createsuperuser

Далее вы введете имя пользователя, адрес электронной почты и пароль (дважды).

Запустите локальный сервер

Мы запустим встроенный сервер Django, runserverчтобы запустить веб-сайт в нашей локальной системе.

На консоли:

(myenvironment) $ python manage.py runserver

Watching for file changes with StatReloader

Performing system checks...

System check identified no issues (0 silenced).

March 09, 2020 — 19:41:22

Django version 3.0.3, using settings 'myproject.settings’

Starting development server at http: //127.0.0.1:8000/

Quit the server with CTRL-BREAK.

Создание записей в базе данных

Теперь мы заполним базу данных, чтобы мы могли просматривать что-то на внешнем интерфейсе.

Перейдем по адресу http: //127.0.0.1:8000/admin/ и введем учетные данные администратора, которые вы только что создали, чтобы мы могли создать двух авторов и четыре статьи:

На панели MYAPP рядом с пунктом «Авторы» щелкните ссылку «Добавить «и создайте не менее двух авторов. Добавлены два автора

На панели MYAPP рядом со статьями нажмите ссылку «Добавить «и создайте как минимум две разные статьи для каждого автора. Добавлены статьи для каждого автора

Обратите внимание, что вы должны добавить статьи после создания нескольких авторов, чтобы вы могли связать их.

Просмотрите сайт!

Пришло время посмотреть, как все это работает вместе!

Полный SPA-код

Вы можете перемещаться по всему коду проекта в моем репозитории GitHub, luzdealba/djangovuejs.

Во всяком случае, это, вероятно, то, что вас больше всего интересует:

<! doctype html>

Django and Vue.js

Wouldn’t it be cool if you could prototype a custom web application that’s responsive (mobile ready), reactive (light-speed fast), with a full–featured back office site to manage the content; all of that in no time? Actually, with a mashup between Django’s and Vue.js, you can! 😁

<router-link

class="nav-link text-primary"

to="/author/"

>

Go to Authors

router-link>

<router-link

class="nav-link text-primary"

to="/article/"

>

Go to Articles

router-link>

<router-view>router-view>

Впереди: микросервисы!

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

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

Хотите верьте, хотите нет, но реализовать микросервис через REST API с помощью Django довольно просто. Все, что вам нужно, это надстройка Django REST framework, которая очень хорошо документирована и, как и все вещи Django, мощная, гибкая и безопасная.

Следующее, что вы можете сделать с открытым API, — это управлять данными прямо на вашем внешнем интерфейсе с помощью Vue.js. Я не могу описывать здесь подробности, но вы можете ознакомиться со статьей «Использование Axios для потребления API «в Vue.js Cookbook.

Подведение итогов

Как вам такое введение в полнофункциональную разработку? Мы создали прототип проекта, который может стать основой для веб-приложения.

И я ничего не разбавлял! На самом деле, поскольку мы используем хранилище Vuex для управления состоянием и Vue Router для динамического сопоставления маршрутов с самого начала, нам не нужно вносить существенных изменений по мере масштабирования приложения. Таким образом, вы можете взять его оттуда и расширить в любом направлении, которое вам нужно — настроить базу данных, улучшить интерфейс и даже создать микросервис!

Не стесняйтесь, если ваши знания Python или JavaScript несколько ограничены. Нам всем нужно с чего-то начинать. Читайте дальше, кодируйте дальше и оставайтесь любопытными!

Делитесь нашими материалами с друзьями!

 

 

Заказать разработку сайта