Среди сайтов выделяют «статические» — сайты, которые представляют собой готовый набор HTML-страниц. Например, так сделаны наши руководства на https://guides.hexlet.io/ru/. Удобно, быстро и дешево. Статическим сайтам не нужно куда-то сохранять информацию, их данные хранятся прямо в HTML.
Чтобы создать статические сайты, используют специальные генераторы, например, https://jekyllrb.com/.
Остальным сайтам повезло меньше. Всё, что создается пользователем, нужно куда-то сохранять. Самый простой способ сохранять — использовать файлы. Насколько он простой, настолько же нерабочий. Блокировки файловой системы не позволят работать с файлом в конкурентной среде. Такой средой является веб, когда с сайтом могут одновременно работать сотни тысяч пользователей.
Поэтому важно понимать устройство операционных систем. https://ru.hexlet.io/pages/recommended-books
Возможность долговременного хранения состояния называется персистентностью. Для персистентного или постоянного хранения данных принято использовать специализированные программы — базы данных. Взаимодействие с ними строят двумя способами:
- Напрямую через библиотеку, которая предназначена для данной базы данных
- Через ORM, которая в большинстве случаев прячет базу данных за большим количеством абстракций
# SQLAlchemy ORM
user = User(
username=request.form["username"],
email=request.form["email"],
)
db.session.add(user)
db.session.commit()
Тема хранения данных очень глубока и требует определенной подготовки. Но профессия построена так, чтобы мы как можно быстрее добрались до веба и научились с ним работать. По этой причине в следующих уроках данные пользователя будут сохраняться в сессии — механизм работающий поверх Cookie. Это будет делаться через предоставленную абстракцию репозитория:
from flask import Flask
from data import UserRepository
app = Flask(__name__)
# Секретный ключ, который используется для криптографической подписи файла сессии
app.config["SECRET_KEY"] = os.getenv("SECRET_KEY")
# Хранилище объектов
repo = UserRepository()
# Сохранение
repo.save(user)
# Ещё одно сохранение
repo.save(user2)
# Извлечение по идентификатору
repo.find(user.id) # => user
# Извлечение всех сущностей
repo.content() # => [user, user2]
Репозиторий отвечает за хранение конкретной сущности. Для каждой свой: пользователи — UserRepository
, машины — CarRepository
и так далее.
Все репозитории в следующих уроках созданы специально для этого курса. Они не являются частью фреймворка Flask или ORM. Исходные файлы любого репозитория доступны в практике.
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.