Python: от данных до своей сводки Урок 56 из 56
Финал: проверить, опубликовать и уметь повторить
Пятьдесят пятый урок и завершение начального курса Python. Собираем проверки в один шлюз, создаём неизменяемый каталог отчёта, публикуем его только после успеха и оставляем читателю проверяемые сведения об источнике и времени сборки.
Что уже построено
За 55 уроков вы прошли путь от print до программы, которая получает настоящие данные, хранит их, считает показатели, рисует график, собирает HTML, работает по расписанию и ограничивает доверие к модели. Финальный шаг не добавляет ещё одну библиотеку. Он не даёт опубликовать половину результата.
Один шлюз перед публикацией
Файл release.py запускает обязательные команды и останавливается на первой ошибке:
import subprocess
import sys
CHECKS = [
[sys.executable, "-m", "pytest", "-q"],
[sys.executable, "-m", "mypy", "--strict", "sholu", "main.py"],
[sys.executable, "main.py", "--offline", "--dry-run"],
]
for command in CHECKS:
print("+", " ".join(command), flush=True)
subprocess.run(command, check=True)
print("READY")
check=True превращает ненулевой код возврата в остановку. Не перехватывайте эту ошибку ради зелёной надписи. Сеть не участвует в проверке публикации: кешированный снимок делает прогон повторяемым, а отдельное обновление данных имеет свои проверки.
Публикуйте каталог, а не рабочую папку
Сначала соберите всё во временный каталог: index.html, встроенную картинку, CSV для проверки и manifest.json. В манифесте укажите время UTC, идентификаторы источников и SHA-256 каждого файла. После успешной проверки атомарно замените каталог public новым.
Так читатель не увидит новый HTML со старой картинкой. Неизменяемый каталог можно загрузить на любой статический хостинг. Перед внешней публикацией откройте его локально:
python release.py
python -m http.server 8000 --directory public
Откройте http://localhost:8000, проверьте мобильную ширину, заголовок, дату, источники, таблицу, график и отсутствие причинных утверждений со статусом review.
Финальный чек-лист
- рабочее дерево содержит только ожидаемые изменения;
- тесты и
mypyпроходят в чистой среде; - offline dry-run ничего не записывает;
- пустой или неполный отчёт не заменяет предыдущий;
- в HTML нет секретов и персональных путей;
- дата, единицы, период и источники видны читателю;
- пользовательский текст экранирован;
- есть резервная копия предыдущего каталога или быстрый откат;
- после публикации URL возвращает
200, а файлы совпадают с манифестом; - журнал сообщает версию данных и результат публикации.
Публикация — это не «скопировать файл». Это переход состояния: проверенный артефакт либо заменяет предыдущий целиком, либо ничего не меняется.
Карта урока
Опорный сигнал: проверки → временный артефакт → атомарная замена → HTTP-проверка → откат.
Скажите своими словами
- Почему нельзя копировать файлы по одному прямо в публичный каталог?
- Что должен содержать
manifest.json? - Зачем после публикации нужен smoke-test по настоящему URL?
- Что означает «откат»?
Разминка
1. Предскажите. Выполнится ли вторая команда после ошибки первой?
import subprocess
import sys
try:
subprocess.run([sys.executable, "-c", "raise SystemExit(1)"], check=True)
print("publish")
except subprocess.CalledProcessError:
print("stopped")
2. Заполните безопасный режим запуска сводки.
python main.py --offline ...
3. Исправьте. Скрипт удаляет старый public до проверки нового каталога.
Итоговое задание
Обязательное. Запустите единый шлюз, соберите каталог public, создайте манифест с SHA-256, откройте локальный HTTP-сервер и проверьте страницу по чек-листу. Смоделируйте одну упавшую проверку и убедитесь, что прежний каталог сохранился.
checks: passed
artifact: complete
publish: ready
На своих данных. Опубликуйте сводку на выбранном статическом хостинге и запишите URL, момент проверки и способ отката.
По желанию. Перенесите тот же шлюз в CI, выдавая ему минимальные права и разрешая публикацию только из защищённой ветки.
Куда двигаться дальше
Начальный курс закончен. Теперь выбирайте не следующий синтаксис, а задачу:
- углубить анализ данных и статистику;
- построить API или веб-приложение;
- изучить базы данных и SQL глубже;
- заняться инженерией машинного обучения;
- внести небольшое исправление в открытый Python-проект.
Сохраните сводку как портфолио: README с задачей, воспроизводимой установкой, скриншотом, источниками, ограничениями и ссылкой на работающий результат говорит о навыке больше, чем список просмотренных тем.
Ответы
- Читатель может получить смесь версий; каталог заменяют целиком после проверки.
- Время сборки, источники и контрольные суммы файлов.
- Локальная сборка не проверяет DNS, сервер, маршрут и реально отданный файл.
- Возврат к последнему известному исправному артефакту.
stopped
- Флаг —
--dry-run.
command = "python main.py --offline --dry-run"
print(command)
python main.py --offline --dry-run
- Сначала полностью соберите и проверьте временный каталог; старый заменяйте только последней атомарной операцией.
states = ["build temporary", "verify", "replace public", "smoke test"]
print(" -> ".join(states))
build temporary -> verify -> replace public -> smoke test
Источники
- Python: subprocess — коды возврата и
check=True. - Python: hashlib — SHA-256 манифеста.
- The Twelve-Factor App: build, release, run — разделение сборки и запуска.
Если вы нашли ошибку или опечатку в тексте статьи, то сообщите нам об этом
Комментарии (0)
Войдите, чтобы оставить комментарий →
Пока нет комментариев. Будьте первым.