Диплом: Создание web-сервисов средствами стека технологий Django+Python3.x+Nginx+Gunicorn+PostgreSQL

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам
22
2. Глава. Поэтапное составление проекта web-сервиса
2.1 Назначение и характеристики создаваемого web-сервиса
Для выпускной квалификационной работы я решил сделать интернет-
магазин. Идея не нова, но целью написания ВКР является возможность
продемонстрировать практические навыки, а не создать startup. Магазин
может быть адаптирован под торговлю любыми физическими товарами, т.е.
ПО или иным электронным продуктом через него торговать не получится.
На рисунке №1 изображена use case[36] диаграмма проекта.
Рисунок 1 - Use Case диаграмма
Начнём с простого. Посетитель сайта может являться либо гостем, либо
зарегистрированным пользователем. Права и возможности гостя и
пользователя отличаются. Гость может лишь ознакомиться с товаром и, при
желании, зарегистрироваться. Пользователь же имеет личный кабинет, в
котором отображаются его заказы, так же, лишь зарегистрированный
23
пользователь может купить товар. Посетитель сайта может осуществлять
поиск интересующего его товара по категориям.
Каждому зарегистрированному пользователю будет присвоена своя
корзина для товаров.
Во время оформления заказа можно выбрать тип доставки: самовывоз
или доставка по указанному адресу.
Оператором сайта выступает владелец интернет – магазина. Он
контролирует корректность данных о товаре, а также осуществляет проверку
зарегистрировавшихся пользователей. Следит за исполнением оформленных
заказов.
Продавцом выступает владелец сайта. Он может добавить товар,
удалять его, изменить его описание, добавлять новые категории и брэнды.
Структура сайта и функционал предусматривает ведение следующих
разделов:
1) Главная страница
2) Категории
3) Личный кабинет
4) Корзина
Авторизация проходит по принципу login-password. В регистрационной
форме указывается помимо логина и пароля, имя, фамилия, адрес
электронной почты.
Товары, добавленные на сайте, будут представлены в виде плитки. Каждая
единица товара в данном разделе будет отображаться в виде блока: название
и фото со ссылкой для перехода к детальному описанию товара, ценой,
кнопка «Добавить в корзину» для возможности оформления заказа.
Страница товара будет содержать: главное фото, название, цену, кнопку
купить, текстовое описание товара.
Раздел «Корзина» будет содержать перечень заказанных товаров с
названием, счетчик количества товара, который можно изменять, ценами
24
товаров и общей суммой к оплате, кнопку удаления товара из корзины,
кнопку для перехода к оформлению товара.
Для вёрстки сайта будут использоваться готовые шаблоны Bootstrap. Для
взаимодействия бизнес логики приложения и frontend будет применяться
библиотека JQuery языка JavaScript [2]. К сожалению, но без HTML и
CSS[44][45] никак не обойтись, поэтому их тоже буду использовать.
Бизнес логика будет реализована на Django 1.11[41], так как по 2.х ветке
этого фреймворка еще нет толковой русскоязычной документации.
2.2 Создание UML-диаграммы проекта
Теперь можно приступать к созданию диаграммы классов нашего
проекта[18][19]. Диаграмма классов служит для представления статической
структуры модели системы в терминологии классов объектно-
ориентированного программирования. На этапе создания диаграммы классов
принципиально знание ООП подхода и паттернов проектирования. На
рисунке 2 изображена диаграмма классов моего проекта
Рисунок 2 - Диаграмма классов
Теперь обсудим что там изображено. Начнём с блока Guest. Название
говорит само за себя. Не авторизованный посетитель сайта не имеет никаких
25
атрибутов, но может просматривать товар, выполнить регистрацию, либо
авторизоваться на сайте.
Просмотр товара связан со следующим блоком Products. Данный блок
содержит следующие атрибуты: заголовок (название товара), изготовитель
(брэнд), категорию, описание, изображение, наличие продукта на складе
(available). И имеет единственный метод, возвращающий ссылку на данный
продукт.
Блок Admin. В нашем случае админом выступает superuser
зарегистрированный при создании базы данных[26]. Из атрибутов имеет имя.
Имеет методы: просмотр продукта, добавление продукта, удаление продукта
или изменение данных о продукте.
Блок Customer отвечает за атрибуты и методы авторизованного
пользователя. Из атрибутов имеет логин, имя, фамилию, адрес электронной
почты. Методы: просмотр товара, добавление товара в корзину, оформление
заказа, выход из учетной записи.
Ну и сама корзина Cart. Из атрибутов содержит наименование товаров
и общую сумму товаров. Из методов: удаление товара из корзины и
изменение количества товаров.
С атрибутами вопросов не возникает, так как это лишь данные, а вот
методы рассмотрим подробнее.
Начнём с метода просмотра товаров.
def product_view(request, product_slug):
try:
cart_id = request.session['cart_id']
cart = Cart.objects.get(id=cart_id)
request.session['total'] = cart.item.count()
except:
cart = Cart()
cart.save()
cart_id = cart.id
request.session['cart_id'] = cart_id
cart = Cart.objects.get(id=cart_id)
product = Products.objects.get(slug=product_slug)
categories = Category.objects.all()
context = {
'product':product,
26
'categories': categories,
'cart': cart,
}
return render(request, 'product.html', context)
Блок try/except позволят создавать корзину для конкретного пользователя и
заносить в неё только те товары, которые выбрал пользователь.
Сама функция перенаправляет пользователя на страницу с описание товара
(последняя строка кода).
Методы AddProducts(), DeleteProducts(), ModifyProducts() реализованы
в панели администратора и самостоятельно их создавать не нужно.
Метод Add_to_cart() добавляет товар в корзину пользователя, если
такой товар не содержится в корзине, а так же увеличивает общую сумму
стоимости товаров корзины.
def add_to_cart(self, product_slug):
cart = self
product = Products.objects.get(slug=product_slug)
new_item, _ = CartItem.objects.get_or_create(product=product, item_total=product.price)
if new_item not in cart.item.all():
cart.item.add(new_item)
cart.save()
Метод Make_order_view() позволяет оформить заказ.
def make_order_view(request):
try:
cart_id = request.session['cart_id']
cart = Cart.objects.get(id=cart_id)
request.session['total'] = cart.item.count()
except:
cart = Cart()
cart.save()
cart_id = cart.id
request.session['cart_id'] = cart_id
cart = Cart.objects.get(id=cart_id)
form = OrderForm(request.POST or None)
categories = Category.objects.all()
if form.is_valid():
name = form.cleaned_data['name']
last_name = form.cleaned_data['last_name']
phone = form.cleaned_data['phone']
address = form.cleaned_data['address']
buying_type = form.cleaned_data['buying_type']
comments = form.cleaned_data['comments']
new_order = Order.objects.create(
user=request.user,
items=cart,
27
total=cart.cart_total,
first_name=name,
last_name=last_name,
phone=phone,
address=address,
buying_type=buying_type,
comments=comments,
)
del request.session['cart_id']
del request.session['total']
return HttpResponseRedirect(reverse('thank_you'))
return render(request, 'order.html', {'categories':categories})
Блок try/except присутствует во всех представлениях (вьюшках). В данном
методе переменная form наследуется от формы создания заказа, если эта
форма валидна, то заказ поступает в обработку администратору и
отображается в личном кабинете.
Метод Remove_from_cart() удаляет товар из корзины.
def remove_from_cart_view(request):
try:…
except:…
product_slug = request.GET.get('product_slug')
product = Products.objects.get(slug=product_slug)
cart.remove_from_cart(product.slug)
new_cart_total = 0.00
for item in cart.item.all():
new_cart_total += float(item.item_total)
cart.cart_total = new_cart_total
cart.save()
return JsonResponse({'cart_total': cart.item.count(), 'cart_total_price': cart.cart_total})
После удаления товара подсчитывается новая цена и сохраняются изменения
корзины.
Метод Change_qty() изменяет счетчик количества товаров в корзине.
def change_qty(self, qty, item_id):
cart = self
cart_item = CartItem.objects.get(id=int(item_id))
cart_item.qty = int(qty)
cart_item.item_total = int(qty) * Decimal(cart_item.product.price)
cart_item.save()
new_cart_total = 0.00
for item in cart.item.all():
new_cart_total += float(item.item_total)
cart.cart_total = new_cart_total
cart.save()
28
Во время изменения количества товара, автоматически подсчитывается
общая цена корзины.
Метод Registration_view() позволяет гостю зарегистрироваться. Сам
метод перенаправляет пользователя на страницу регистрации.
def registration_view(request):
form = RegistrationForm(request.POST or None)
categories = Category.objects.all()
if form.is_valid():
new_user = form.save(commit=False)
username = form.cleaned_data['username']
password = form.cleaned_data['password']
email = form.cleaned_data['email']
first_name = form.cleaned_data['first_name']
last_name = form.cleaned_data['last_name']
new_user.username = username
new_user.set_password(password)
new_user.first_name = first_name
new_user.last_name = last_name
new_user.email = email
new_user.save()
login_user = authenticate(username=username, password=password)
if login_user:
login(request, login_user)
return HttpResponseRedirect(reverse('base'))
context ={
'form': form,
'categories':categories,
}
return render(request, 'registration.html', context)
Форма является объектом класса RegistrationForm() что позволяет
наследовать поля для регистрации с проверкой на валидность и подсказками.
Метод Login_view() позволяет зарегистрированным пользователям
авторизоваться на сайте.
def login_view(request):
form = LoginForm(request.POST or None)
categories = Category.objects.all()
if form.is_valid():
username = form.cleaned_data['username']
password = form.cleaned_data['password']
login_user = authenticate(username=username, password=password)
if login_user:
login(request, login_user)
return HttpResponseRedirect(reverse('base'))
context ={
'form':form,
29
'categories':categories,
}
return render(request, 'login.html', context)
Сама форма наследуется от LoginForm(). Если авторизация прошла хорошо
(т.е. форма валидна) пользователя перенаправляет на главную страницу.
Итак, основные методы, используемые пользователя сайта были
описаны. Теперь разберём базу данных.
2.3 Проектирование базы данных
Важной составляющей современных web приложений является
хранение и обработка данных. Фактически большая часть бизнес-логики
приложения связана не с вычислениями, а с изменением и поиском каких-
либо данных. Для того что бы сохранить данные используются базы данных.
Базы данных классифицируются на:
1) Иерархическая (древовидная)
2) Объектная и объектно-ориентированная
3) Реляционная
4) Сетевая
5) Функциональная
Мы остановим своё внимание на реляционной базе данных.
Для того что бы база данных приносила пользу её необходимо
правильно спроектировать, для этого необходимо правильно собрать данные
о будущей БД. Именно поэтому, методом проб и ошибок, были созданы
основные требования к БД[8]:
1) Удовлетворение информационных потребностей различных категорий
пользователей
2) Обеспечение достоверности данных в базе, исключение дублирования
информации
3) Обеспечение надёжности и эффективности функционирования системы
баз данных
4) Защита базы данных от сбоев и несанкционированного доступа
30
5) Возможность гибкой и нетрудоёмкой модификации при изменении
требований, программных и технических средств
После сбора информации и получения начального представления о
предстоящей работе, можно начинать разработку. И что бы работу не
забраковали нужно учитывать фундаментальные свойства БД:
1) Целостность
БД обладает свойством целостности, если она удовлетворяет
некоторым определённым ограничениям значений, данных и сохраняет
это свойство при всех модификациях (замена, добавление или
удаление) базы данных
2) Согласованность
БД обладает свойством согласованности по отношению к некоторой
совокупности пользователей, если в любой момент времени база
данных реагирует на их запросы одинаковым образом (т.е. все
пользователи на заданный ими конкретный запрос получают
одинаковый ответ)
3) Восстанавливаемость
Возможность восстановления с помощью СУБД целостности базы
данных после любого сбоя системы.
4) Безопасность
Защита данных от преднамеренного или непреднамеренного доступа,
модификации или разрушения.
5) Эффективность
Степень соизмерения результатов функционирования базы данных с
затратами на обеспечение целостности базы данных.
К великому сожалению, не всегда удаётся соблюдать досконально все
свойства БД, но это не значит, что их можно полностью игнорировать. При
обсуждении с заказчиком базы данных необходимо оговорить приоритеты
перечисленных свойств, чтобы понять, чему стоит уделить больше внимания.
31
После сбора всех требования и обсуждения будущей базы данных с
заказчиком можно приступать к проектированию БД. Сухое определение
проектирования звучит так.
Проектирование БД – это процесс определения содержания БД,
эффективного и безопасного способа организации данных и
инструментальных средств управления данными.
Проектирование БД включает в себя следующие этапы:
1) Инфологическое (концептуальное) проектирование
Подразумевает под собой сбор требований к базе данных, общение с
заказчиком, определение приоритетов при построении БД. На этом
этапе требуется глубокое понимание будущей системы и принципа её
функционирования. Может создаваться первоначальная документация.
2) Определение требований к окружению, в котором будет
функционировать ИС
На этом этапе разработчик должен определить возможные нагрузки на
БД. Образно выражаясь, предположить, а что будет с БД через год?
Сколько там будет записей, какая производительность требуется,
сколько запросов в секунду возможно к БД и т.д. Всё это необходимо,
что БД работала на протяжении длительного срока и отвечала запросам
пользователей.
3) Выбор СУБД и других программных средств
На этом этапе, учитывая данные с предыдущих этапов, можно
выбирать СУБД, подходящую для будущей ИС. У каждой СУБД есть
достоинства и недостатки, которые необходимо учитывать. Со
временем количество записей в БД будет лишь увеличиваться, а значит
слабая СУБД может не выдержать нагрузки.
4) Логическое проектирование БД
На этом этапе создаётся абстрактное представление о будущей БД.
Результатом ЛП является СУБД-ориентированная структура БД и
спецификации ПО. На этом этапе часто моделируют базы данных

Смотрите также:

"Автоматизация обработки заявок ООО "Проектно-Строительная Компания"
"Автоматизация процесса аттестации персонала для ООО "Нэт Бай Нэт Холдинг"
"Анализ интернет-активности конкурентов ( на примере конкурентов "Газпром нефть")
"Бухгалтерский учёт и аудит расчётов с подотчётними лицами в организации на примере ООО "ЛОЦ 10""
«Психологическое сопровождение персонала в организации на примере ООО «Крокус»
Cовершенствование деловой оценки персонала в организации (на примере ООО "Даймонд кейтеринг развитие")
PR как средство продвижения организации (на примере ПАО "Тамбовский завод "Комсомолец им. Н.С. Артемова")
PR-коммуникации в сфере общественного питания (на примере кафе-кондитерской «Cream Cheese»)
SMM как средство повышения эффективности работы учреждений социокультурной сферы (на примере Малого театра)
Value-based education: ценности в системе образования и способы их реализации на уроке английского языка. Опыт Европейских стран