Загрузка данных
Отчет по проекту
WSGI-приложение картотеки бронирований гостиницы «Космос»
1. Цель работы
Целью проекта является разработка WSGI-приложения на языке Python для реализации картотеки бронирований гостиницы «Космос» с использованием базы данных SQLite.
В ходе выполнения проекта необходимо реализовать веб-приложение, которое позволяет пользователям регистрироваться, входить в личный кабинет, создавать бронирования, просматривать свои бронирования, оплачивать их и отменять. Также необходимо предусмотреть административные функции для управления пользователями и бронированиями.
Проект разрабатывается с учетом дизайна, созданного в первой лабораторной работе. В макете были предусмотрены страницы главной, входа, регистрации, личного кабинета, бронирования, оплаты и списка бронирований . Также проект учитывает функциональность консольной программы из предыдущей лабораторной работы, где уже были реализованы регистрация, авторизация, создание бронирований, оплата, сохранение и загрузка данных .
2. Постановка задачи
Необходимо разработать WSGI-приложение картотеки бронирований гостиницы с использованием базы данных SQLite.
Приложение должно обеспечивать:
регистрацию пользователей;
авторизацию пользователей;
создание бронирований;
просмотр личных бронирований;
расчет стоимости проживания;
оплату бронирования;
отмену бронирования;
редактирование профиля пользователя;
административное управление пользователями и бронированиями;
импорт данных, сохраненных в предыдущей лабораторной работе;
хранение данных в базе данных SQLite.
Дополнительно необходимо выполнить следующие технические требования:
использовать подкаталог data для хранения данных;
размещать шаблоны страниц в app/templates;
при необходимости размещать статические файлы в app/static;
использовать механизм подстановки параметров DB-API;
предусмотреть возможность изменения идентификатора модуля приложения.
3. Описание предметной области
Предметной областью проекта является система бронирования гостиничных номеров.
Пользователь сайта может зарегистрироваться, войти в систему, выбрать даты проживания, указать количество взрослых и детей, выбрать тип номера и создать бронирование. После создания бронирования пользователь может просмотреть его в личном кабинете, оплатить или отменить.
Администратор системы имеет расширенные права. Он может просматривать всех пользователей, видеть все бронирования, изменять статус бронирования, редактировать или удалять записи.
В проекте рассматривается гостиница «Космос». По макету из первой лабораторной работы сайт содержит главную страницу с описанием гостиницы, блоком «О нас», контактной информацией, ссылками на регистрацию, вход и бронирование .
4. Назначение приложения
Разрабатываемое приложение предназначено для автоматизации процесса бронирования номеров в гостинице.
Приложение позволяет заменить ручное ведение записей электронной картотекой, в которой данные пользователей и бронирований хранятся в структурированном виде.
Основное назначение проекта:
упростить процесс создания бронирований;
обеспечить хранение информации о клиентах;
автоматизировать расчет стоимости проживания;
обеспечить просмотр истории бронирований;
предоставить администратору инструменты управления данными.
5. Основные пользователи системы
В системе предусмотрены две основные роли:
Пользователь — клиент гостиницы, который может создавать и оплачивать бронирования.
Администратор — сотрудник гостиницы, который управляет пользователями и бронированиями.
Пользователь имеет доступ только к своим данным и своим бронированиям. Администратор имеет доступ ко всем пользователям и всем бронированиям.
6. Функциональные возможности пользователя
Пользователь может выполнять следующие действия:
зарегистрироваться на сайте;
войти в личный кабинет;
просмотреть свои личные данные;
изменить настройки профиля;
создать новое бронирование;
выбрать дату заезда и дату выезда;
указать количество взрослых гостей и детей;
выбрать тип номера;
просмотреть рассчитанную стоимость проживания;
просмотреть список своих бронирований;
оплатить бронирование;
отменить бронирование;
выйти из учетной записи.
В первой лабораторной работе уже были предусмотрены страницы регистрации, входа, личного кабинета, бронирования и списка бронирований, поэтому веб-приложение должно реализовать эту структуру в рабочем виде .
7. Функциональные возможности администратора
Администратор может выполнять следующие действия:
войти в административную часть приложения;
просматривать список всех пользователей;
просматривать список всех бронирований;
фильтровать бронирования по статусу;
редактировать данные бронирования;
изменять статус бронирования;
удалять бронирования;
импортировать данные из файла предыдущей лабораторной работы.
В консольной версии приложения из предыдущей лабораторной работы уже была реализована административная логика: просмотр пользователей, просмотр бронирований, редактирование, удаление, смена статуса и фильтрация бронирований .
8. Структура проекта
Проект имеет следующую структуру:
project/
│
├── app/
│ ├── __init__.py
│ ├── routes.py
│ ├── db.py
│ ├── models.py
│ │
│ ├── templates/
│ │ ├── index.html
│ │ ├── login.html
│ │ ├── register.html
│ │ ├── booking.html
│ │ ├── my_bookings.html
│ │ ├── payment.html
│ │ ├── profile.html
│ │ ├── settings.html
│ │ └── admin.html
│ │
│ └── static/
│ ├── css/
│ ├── js/
│ └── images/
│
├── data/
│ ├── database.sqlite
│ └── import_data.pkl
│
├── wsgi.py
├── config.py
└── requirements.txt
Каталог app содержит основную логику приложения.
Каталог app/templates содержит HTML-шаблоны страниц.
Каталог app/static используется для хранения CSS-файлов, изображений и JavaScript-файлов.
Каталог data используется для хранения базы данных SQLite и файла для импорта данных.
Файл wsgi.py является точкой входа WSGI-приложения.
Файл config.py содержит настройки проекта.
Файл requirements.txt содержит список зависимостей проекта.
9. Описание WSGI-приложения
WSGI расшифровывается как Web Server Gateway Interface. Это стандарт взаимодействия между веб-сервером и Python-приложением.
В данном проекте WSGI используется для запуска веб-приложения. Когда пользователь открывает страницу сайта, веб-сервер принимает запрос и передает его Python-приложению через WSGI. После обработки запроса приложение возвращает пользователю HTML-страницу.
Точка входа приложения находится в файле wsgi.py.
Пример структуры файла:
from app import create_app
application = create_app()
Такой подход позволяет запускать приложение через WSGI-сервер и не привязывать проект к конкретному имени модуля. Это важно, потому что по требованиям лабораторной работы необходимо учитывать возможные изменения идентификатора своего модуля.
10. Используемая база данных
В проекте используется база данных SQLite.
SQLite выбрана потому, что она не требует отдельного сервера базы данных и подходит для учебного проекта. Все данные хранятся в одном файле:
data/database.sqlite
База данных используется для хранения:
данных пользователей;
данных бронирований;
данных об оплатах.
11. Структура базы данных
11.1. Таблица users
Таблица users хранит информацию о пользователях системы.
id INTEGER PRIMARY KEY AUTOINCREMENT
surname TEXT NOT NULL
name TEXT NOT NULL
patronymic TEXT
email TEXT NOT NULL UNIQUE
phone TEXT NOT NULL
passport_series TEXT NOT NULL
passport_number TEXT NOT NULL
password_hash TEXT NOT NULL
role TEXT NOT NULL DEFAULT 'user'
created_at TEXT NOT NULL
Описание полей:
id — уникальный идентификатор пользователя;
surname — фамилия пользователя;
name — имя пользователя;
patronymic — отчество пользователя;
email — адрес электронной почты;
phone — номер телефона;
passport_series — серия паспорта;
passport_number — номер паспорта;
password_hash — хеш пароля;
role — роль пользователя;
created_at — дата создания записи.
11.2. Таблица bookings
Таблица bookings хранит информацию о бронированиях.
id INTEGER PRIMARY KEY AUTOINCREMENT
user_id INTEGER NOT NULL
room_type TEXT NOT NULL
check_in TEXT NOT NULL
check_out TEXT NOT NULL
adults INTEGER NOT NULL
children INTEGER NOT NULL DEFAULT 0
days INTEGER NOT NULL
price INTEGER NOT NULL
status TEXT NOT NULL DEFAULT 'Новая'
payment_method TEXT
created_at TEXT NOT NULL
FOREIGN KEY(user_id) REFERENCES users(id)
Описание полей:
id — уникальный идентификатор бронирования;
user_id — идентификатор пользователя;
room_type — тип номера;
check_in — дата заезда;
check_out — дата выезда;
adults — количество взрослых гостей;
children — количество детей;
days — количество дней проживания;
price — стоимость бронирования;
status — статус бронирования;
payment_method — способ оплаты;
created_at — дата создания записи.
11.3. Таблица payments
Таблица payments хранит информацию об оплатах.
id INTEGER PRIMARY KEY AUTOINCREMENT
booking_id INTEGER NOT NULL
payment_method TEXT NOT NULL
amount INTEGER NOT NULL
status TEXT NOT NULL
created_at TEXT NOT NULL
FOREIGN KEY(booking_id) REFERENCES bookings(id)
Описание полей:
id — уникальный идентификатор оплаты;
booking_id — идентификатор бронирования;
payment_method — способ оплаты;
amount — сумма оплаты;
status — статус оплаты;
created_at — дата создания записи.
12. Основные страницы приложения
12.1. Главная страница
Главная страница содержит:
название гостиницы;
описание гостиницы;
блок «О нас»;
кнопки перехода к бронированию;
ссылки на вход и регистрацию;
контактную информацию.
В макете первой лабораторной работы главная страница содержит описание гостиницы «Космос», информацию о расположении, блок правовой информации, контакты и ссылки на личный кабинет .
12.2. Страница регистрации
Страница регистрации содержит форму создания аккаунта.
Поля формы:
имя;
фамилия;
отчество;
номер телефона;
почта;
серия паспорта;
номер паспорта;
пароль;
подтверждение пароля.
Обязательные поля должны быть заполнены пользователем. При отправке формы система проверяет корректность данных и сохраняет пользователя в базу данных.
12.3. Страница входа
Страница входа содержит форму авторизации.
Поля формы:
почта или номер телефона;
пароль.
После успешной авторизации пользователь попадает в личный кабинет.
12.4. Личный кабинет
Личный кабинет отображает данные пользователя:
фамилию;
имя;
отчество;
почту;
номер телефона;
паспортные данные.
Также из личного кабинета пользователь может перейти к настройкам, бронированию и списку своих бронирований.
12.5. Страница настроек
На странице настроек пользователь может изменить личные данные.
Доступные для изменения данные:
имя;
фамилия;
отчество;
номер телефона;
почта;
серия паспорта;
номер паспорта;
пароль.
При изменении пароля необходимо указать старый пароль и новый пароль.
12.6. Страница бронирования
На странице бронирования пользователь указывает:
дату заезда;
дату выезда;
количество взрослых гостей;
количество детей;
тип номера.
После ввода данных система рассчитывает количество дней проживания и итоговую стоимость.
В макете первой лабораторной работы страница бронирования уже содержит поля даты заезда, даты выезда, количества взрослых, количества детей, дней проживания и стоимости .
12.7. Страница «Мои бронирования»
На странице отображаются все бронирования текущего пользователя.
Для каждого бронирования выводятся:
дата заезда;
дата выезда;
количество взрослых;
количество детей;
тип номера;
стоимость;
статус;
кнопка оплаты;
кнопка отмены.
В макете ЛР1 была предусмотрена страница «Мои бронирования», где отображались активные, отмененные и прошедшие бронирования .
12.8. Страница оплаты
Страница оплаты позволяет выбрать способ оплаты.
Доступные способы оплаты:
оплата при заселении;
оплата по СБП;
оплата картой.
При выборе оплаты картой отображаются поля:
номер карты;
владелец карты;
срок действия;
CVV.
Данные карты не сохраняются в базе данных.
В макете ЛР1 страница оплаты уже содержит сумму, выбор способа оплаты и поля банковской карты .
12.9. Административная панель
Административная панель предназначена для управления системой.
Администратор может:
просматривать пользователей;
просматривать бронирования;
фильтровать бронирования;
редактировать бронирования;
удалять бронирования;
изменять статус бронирования;
выполнять импорт данных.
13. Маршруты приложения
В приложении используются следующие маршруты:
GET / главная страница
GET /register форма регистрации
POST /register обработка регистрации
GET /login форма входа
POST /login обработка входа
GET /logout выход из аккаунта
GET /profile личный кабинет
GET /settings настройки профиля
POST /settings сохранение настроек
GET /booking форма бронирования
POST /booking создание бронирования
GET /my-bookings список бронирований пользователя
POST /booking/<id>/cancel отмена бронирования
GET /booking/<id>/payment страница оплаты
POST /booking/<id>/payment обработка оплаты
GET /admin административная панель
GET /admin/users список пользователей
GET /admin/bookings список всех бронирований
POST /admin/booking/<id>/edit изменение бронирования
POST /admin/booking/<id>/delete удаление бронирования
POST /admin/booking/<id>/status изменение статуса
POST /admin/import импорт данных
Эти маршруты обеспечивают полный цикл работы пользователя и администратора.
14. Расчет стоимости бронирования
Стоимость бронирования рассчитывается автоматически.
В проекте используются три типа номеров:
Стандарт — 4000 рублей за сутки
Комфорт — 7000 рублей за сутки
Люкс — 12000 рублей за сутки
Формула расчета стоимости:
Стоимость = цена номера за сутки × количество дней + количество детей × 500 × количество дней
Количество дней рассчитывается как разница между датой выезда и датой заезда:
Количество дней = дата выезда - дата заезда
Если дата выезда раньше даты заезда или совпадает с ней, бронирование не создается.
Такая логика соответствует предыдущей лабораторной работе, где стоимость зависела от типа номера, количества дней и количества детей .
15. Статусы бронирований
В системе используются следующие статусы бронирования:
Новая
Оплачено
Отменено
Прошедшее
Статус Новая присваивается бронированию после создания.
Статус Оплачено устанавливается после успешной оплаты.
Статус Отменено устанавливается после отмены бронирования пользователем или администратором.
Статус Прошедшее может использоваться для бронирований, дата выезда которых уже прошла.
16. Импорт данных из предыдущей лабораторной работы
В предыдущей лабораторной работе данные сохранялись в файл с помощью модуля pickle .
В новом проекте необходимо предусмотреть импорт этих данных в базу данных SQLite.
Файл для импорта размещается в каталоге:
data/import_data.pkl
Импорт должен выполнять следующие действия:
открыть файл с сохраненными данными;
прочитать пользователей и бронирования;
преобразовать данные в формат таблиц SQLite;
проверить наличие дубликатов;
сохранить пользователей в таблицу users;
сохранить бронирования в таблицу bookings;
вывести сообщение о результате импорта.
Если файл отсутствует или поврежден, приложение должно обработать ошибку и вывести понятное сообщение.
17. Работа с DB-API
При работе с базой данных необходимо использовать механизм подстановки параметров DB-API.
Это значит, что пользовательские данные нельзя напрямую вставлять в SQL-запрос через конкатенацию строк.
Неправильный пример:
query = "SELECT * FROM users WHERE email = '" + email + "'"
Правильный пример:
cursor.execute(
"SELECT * FROM users WHERE email = ?",
(email,)
)
Такой подход защищает приложение от SQL-инъекций. Без него сайт превращается в бесплатный аттракцион для любого, кто умеет писать кавычки в поле ввода. Гениальная, конечно, идея, но лучше не надо.
18. Требования к безопасности
В проекте должны быть предусмотрены основные меры безопасности.
Пароли пользователей не должны храниться в открытом виде. Перед сохранением в базу данных пароль должен быть преобразован в хеш.
Пользователь должен иметь доступ только к своим бронированиям.
Административные функции должны быть доступны только пользователю с ролью администратора.
SQL-запросы должны выполняться только с использованием параметров DB-API.
Данные банковских карт не должны сохраняться в базе данных.
Все формы должны проверяться на стороне сервера.
При ошибках приложение не должно показывать пользователю техническую информацию о внутреннем устройстве системы.
19. Обработка ошибок
Приложение должно обрабатывать следующие ошибки:
пустые обязательные поля;
несовпадение пароля и подтверждения пароля;
попытка регистрации с уже существующей почтой;
неверный логин или пароль;
некорректная дата заезда;
некорректная дата выезда;
дата выезда раньше даты заезда;
попытка оплатить чужое бронирование;
попытка отменить чужое бронирование;
попытка доступа к административной панели без прав администратора;
ошибка подключения к базе данных;
отсутствие файла импорта;
ошибка чтения файла импорта.
Во всех случаях пользователь должен получать понятное сообщение об ошибке.
20. Описание логики работы приложения
Сначала пользователь открывает главную страницу сайта. Если у него нет аккаунта, он переходит на страницу регистрации и вводит личные данные.
После регистрации пользователь может войти в систему через форму авторизации. После успешного входа он попадает в личный кабинет.
Далее пользователь может перейти на страницу бронирования. Он указывает дату заезда, дату выезда, количество гостей и тип номера. Система проверяет корректность дат, рассчитывает количество дней проживания и стоимость бронирования.
После создания бронирование сохраняется в базе данных со статусом Новая.
Пользователь может открыть страницу «Мои бронирования» и увидеть список всех своих бронирований. Для активного бронирования доступна оплата или отмена.
При оплате пользователь выбирает способ оплаты. После успешной оплаты статус бронирования изменяется на Оплачено.
Администратор может войти в систему и управлять всеми пользователями и бронированиями через административную панель.
21. Пример алгоритма создания бронирования
Алгоритм создания бронирования:
1. Пользователь входит в систему.
2. Пользователь открывает страницу бронирования.
3. Пользователь вводит дату заезда.
4. Пользователь вводит дату выезда.
5. Пользователь указывает количество взрослых.
6. Пользователь указывает количество детей.
7. Пользователь выбирает тип номера.
8. Система проверяет корректность введенных данных.
9. Система рассчитывает количество дней проживания.
10. Система рассчитывает стоимость.
11. Система сохраняет бронирование в SQLite.
12. Пользователь получает сообщение об успешном создании бронирования.
22. Пример алгоритма оплаты бронирования
Алгоритм оплаты бронирования:
1. Пользователь открывает список своих бронирований.
2. Пользователь выбирает неоплаченное бронирование.
3. Пользователь переходит на страницу оплаты.
4. Пользователь выбирает способ оплаты.
5. При выборе карты пользователь вводит данные карты.
6. Система проверяет принадлежность бронирования текущему пользователю.
7. Система создает запись об оплате.
8. Система меняет статус бронирования на «Оплачено».
9. Пользователь получает сообщение об успешной оплате.
23. Пример алгоритма импорта данных
Алгоритм импорта данных:
1. Администратор запускает импорт данных.
2. Система ищет файл data/import_data.pkl.
3. Система открывает файл.
4. Система считывает пользователей и бронирования.
5. Система проверяет корректность данных.
6. Система проверяет отсутствие дубликатов.
7. Система записывает пользователей в таблицу users.
8. Система записывает бронирования в таблицу bookings.
9. Система выводит сообщение о завершении импорта.
24. Ожидаемый результат
В результате выполнения проекта должно быть создано веб-приложение, которое:
запускается как WSGI-приложение;
использует SQLite для хранения данных;
имеет структуру каталогов data, app/templates, app/static;
реализует регистрацию пользователей;
реализует вход пользователей;
реализует личный кабинет;
позволяет создавать бронирования;
рассчитывает стоимость проживания;
позволяет оплачивать бронирования;
позволяет отменять бронирования;
имеет административную панель;
поддерживает импорт данных из предыдущей лабораторной работы;
использует безопасные SQL-запросы через параметры DB-API;
соответствует дизайну, разработанному в первой лабораторной работе.
25. Вывод
В ходе выполнения проекта было спроектировано WSGI-приложение картотеки бронирований гостиницы «Космос». Приложение объединяет интерфейс, разработанный в первой лабораторной работе, и функциональную логику консольного приложения из предыдущей лабораторной работы.
В проекте предусмотрены регистрация и авторизация пользователей, создание бронирований, расчет стоимости, просмотр личных бронирований, оплата, отмена и административное управление. Для хранения данных используется база данных SQLite, расположенная в каталоге data.
Также в проекте предусмотрена возможность импорта данных, сохраненных в предыдущей лабораторной работе. Для безопасной работы с базой данных используются параметры DB-API, а пароли пользователей должны храниться в виде хеша.
Таким образом, разработанное приложение представляет собой полноценную учебную веб-систему бронирования гостиницы, которая демонстрирует работу с WSGI, HTML-шаблонами, SQLite, пользовательскими сессиями, обработкой форм и базовой защитой данных.