Compare commits
No commits in common. "9a23fc52e0ac7c6b59db1b842b22ed048f26c668" and "81b91a8c2bedc9a74818298238aaeb38b09bcf97" have entirely different histories.
9a23fc52e0
...
81b91a8c2b
42
.github/workflows/ci.yml
vendored
|
|
@ -1,42 +0,0 @@
|
|||
name: CI
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
lint-and-homework:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.12"
|
||||
- run: pip install ruff==0.14.0 pytest==8.4.2
|
||||
- name: Ruff (синтаксис и ошибки)
|
||||
run: ruff check --select E9,F .
|
||||
- name: Тесты домашних заданий
|
||||
run: |
|
||||
cd hws/hw-1 && pytest -q test.py && cd ../..
|
||||
cd hws/hw-2 && pytest -q test.py
|
||||
|
||||
apps:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
app: [labs/lab-1/app, labs/lab-2/app, labs/lab-3/app, labs/lab-4/app, labs/lab-5/app, labs/lab-6/app, ex]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.10"
|
||||
- name: Зависимости
|
||||
run: |
|
||||
req=$(dirname ${{ matrix.app }})/requirements.txt
|
||||
[ -f ${{ matrix.app }}/requirements.txt ] && req=${{ matrix.app }}/requirements.txt
|
||||
pip install -r $req
|
||||
- name: Приложение импортируется
|
||||
working-directory: ${{ matrix.app }}
|
||||
run: python -c "import app"
|
||||
12
.gitignore
vendored
|
|
@ -1,12 +0,0 @@
|
|||
__pycache__/
|
||||
*.py[cod]
|
||||
.venv/
|
||||
venv/
|
||||
.env
|
||||
*.db
|
||||
instance/
|
||||
ex/app/static/uploads/*
|
||||
!ex/app/static/uploads/.gitkeep
|
||||
labs/lab-6/app/media/images/*
|
||||
!labs/lab-6/app/media/images/.gitkeep
|
||||
.pytest_cache/
|
||||
56
README.en.md
|
|
@ -1,56 +0,0 @@
|
|||
# Web Development
|
||||
|
||||
[Русский](README.md) · **English**
|
||||
|
||||
[](https://github.com/EDeev/web-dev/actions/workflows/ci.yml)
|
||||
|
||||
Labs, homework and the exam project for the "Web Development" course at Moscow Polytechnic University:
|
||||
six Flask apps, 37 Python exercises with tests, and an online library.
|
||||
|
||||
**Status:** coursework (Moscow Polytech, group 241-327, 2025/26), completed, archived ·
|
||||
labs at [web-dev.deev.space](https://web-dev.deev.space), exam at [ex-web.deev.su](https://ex-web.deev.su)
|
||||
|
||||

|
||||
|
||||
**Stack:** Python · Flask · Jinja2 · Flask-Login · Flask-SQLAlchemy · Flask-Migrate · SQLite/MySQL · Bootstrap 5 · pytest
|
||||
|
||||
| Folder | Contents |
|
||||
|---|---|
|
||||
| `labs/lab-1` | blog post template with Flask and Jinja2 |
|
||||
| `labs/lab-2` | request data: parameters, headers, cookies, forms, phone number validation |
|
||||
| `labs/lab-3` | sign-in with Flask-Login, protected pages, sessions |
|
||||
| `labs/lab-4` | user accounts CRUD: database, validation, password hashing |
|
||||
| `labs/lab-5` | roles and permissions, visit log, reports with CSV export |
|
||||
| `labs/lab-6` | education portal: course reviews, ratings, pagination, filters |
|
||||
| `hws/hw-1`, `hws/hw-2` | 37 Python exercises (algorithms, files, decorators, generators, OOP) and 241 tests |
|
||||
| `ex` | exam: book catalog with search, reviews and roles (admin, moderator, user) |
|
||||
|
||||
## Running
|
||||
|
||||
```bash
|
||||
cd labs/lab-3 && pip install -r requirements.txt
|
||||
cd app && FLASK_DEBUG=1 python app.py
|
||||
|
||||
cd ex && pip install -r requirements.txt
|
||||
python db/db_seed.py # database, roles and test users (passwords are printed)
|
||||
python run.py
|
||||
```
|
||||
|
||||
`SECRET_KEY` and `FLASK_DEBUG` come from environment variables. Homework tests:
|
||||
`cd hws/hw-1 && pytest test.py`.
|
||||
|
||||
## License
|
||||
|
||||
Coursework (Web Development, Moscow Polytechnic University, 2025/26). The code is open for study; there
|
||||
is no separate license.
|
||||
|
||||
## Author
|
||||
|
||||
**Egor Deev** — [GitHub](https://github.com/EDeev) · [Telegram](https://t.me/DeevEgor) · [egor@deev.space](mailto:egor@deev.space)
|
||||
|
||||
---
|
||||
|
||||
<div align="center">
|
||||
<sub>⭐ If you find this project useful, give it a star on GitHub!</sub>
|
||||
<p><sub>Made with ❤️ — <a href="https://deev.space">deev.space</a></sub></p>
|
||||
</div>
|
||||
106
README.md
|
|
@ -1,56 +1,90 @@
|
|||
# Веб-разработка
|
||||
# Курс Веб-разработки
|
||||
[](https://www.python.org/)
|
||||
[](https://flask.palletsprojects.com/)
|
||||
[](https://www.sqlite.org/)
|
||||
[](https://getbootstrap.com/)
|
||||
|
||||
**Русский** · [English](README.en.md)
|
||||
Репозиторий содержит выполненные лабораторные работы и домашние задания по курсу "Веб-разработка" в Московском Политехническом университете.
|
||||
|
||||
[](https://github.com/EDeev/web-dev/actions/workflows/ci.yml)
|
||||
**Веб-сайт проекта:** [web-dev.deev.space](https://web-dev.deev.space)
|
||||
|
||||
Лабораторные, домашние задания и экзаменационный проект по курсу «Веб-разработка» в Московском
|
||||
Политехе: шесть Flask-приложений, 37 задач на Python с тестами и электронная библиотека.
|
||||
**Автор:** Деев Егор Викторович, группа 241-327
|
||||
|
||||
**Статус:** учебный проект (Московский Политех, группа 241-327, 2025/26), завершён, в архиве ·
|
||||
лабораторные — [web-dev.deev.space](https://web-dev.deev.space), экзамен — [ex-web.deev.su](https://ex-web.deev.su)
|
||||
## Структура репозитория
|
||||
|
||||

|
||||
### Лабораторные работы
|
||||
|
||||
**Стек:** Python · Flask · Jinja2 · Flask-Login · Flask-SQLAlchemy · Flask-Migrate · SQLite/MySQL · Bootstrap 5 · pytest
|
||||
#### [Лабораторная работа №1](https://web-dev.deev.space/lab1)
|
||||
Создание шаблона для отображения записи блога с использованием Flask и Jinja2. Реализация базовой структуры приложения, шаблонов для отображения постов и комментариев.
|
||||
|
||||
| Папка | Что внутри |
|
||||
|---|---|
|
||||
| `labs/lab-1` | шаблон записи блога на Flask и Jinja2 |
|
||||
| `labs/lab-2` | данные запроса: параметры, заголовки, cookies, формы, проверка телефона |
|
||||
| `labs/lab-3` | вход через Flask-Login, защищённые страницы, сессии |
|
||||
| `labs/lab-4` | CRUD учётных записей: база, валидация, хеширование паролей |
|
||||
| `labs/lab-5` | роли и права, журнал посещений, отчёты с экспортом в CSV |
|
||||
| `labs/lab-6` | образовательный портал: отзывы к курсам, рейтинг, пагинация, фильтры |
|
||||
| `hws/hw-1`, `hws/hw-2` | 37 задач на Python (алгоритмы, файлы, декораторы, генераторы, ООП) и 241 тест |
|
||||
| `ex` | экзамен: каталог книг с поиском, рецензиями и ролями (администратор, модератор, пользователь) |
|
||||
**Стек:** Flask, Jinja2, Bootstrap 5
|
||||
|
||||
## Запуск
|
||||
#### [Лабораторная работа №2](https://web-dev.deev.space/lab2)
|
||||
Работа с данными запроса. Реализация обработки параметров URL, заголовков, cookies и форм. Валидация номера телефона на стороне сервера.
|
||||
|
||||
```bash
|
||||
cd labs/lab-3 && pip install -r requirements.txt
|
||||
cd app && FLASK_DEBUG=1 python app.py
|
||||
**Стек:** Flask, регулярные выражения
|
||||
|
||||
cd ex && pip install -r requirements.txt
|
||||
python db/db_seed.py # база, роли и тестовые пользователи (пароли выводятся в консоль)
|
||||
python run.py
|
||||
```
|
||||
#### [Лабораторная работа №3](https://web-dev.deev.space/lab3)
|
||||
Реализация аутентификации пользователей с использованием Flask-Login. Создание системы входа, защищенных страниц и управления сессиями.
|
||||
|
||||
`SECRET_KEY` и `FLASK_DEBUG` задаются переменными окружения. Тесты домашних заданий:
|
||||
`cd hws/hw-1 && pytest test.py`.
|
||||
**Стек:** Flask, Flask-Login, session management
|
||||
|
||||
## Лицензия
|
||||
#### [Лабораторная работа №4](https://web-dev.deev.space/lab4)
|
||||
Разработка CRUD-приложения для управления учетными записями пользователей. Работа с базой данных, валидация данных, хеширование паролей.
|
||||
|
||||
Учебный проект (Веб-разработка, Московский Политех, 2025/26). Код открыт для изучения, отдельной
|
||||
лицензии нет.
|
||||
**Стек:** Flask, Flask-SQLAlchemy, MySQL, bcrypt
|
||||
|
||||
## Автор
|
||||
#### [Лабораторная работа №5](https://web-dev.deev.space/lab5)
|
||||
Авторизация пользователей и формирование статистических отчетов. Реализация системы ролей, декораторов проверки прав, журнала посещений и экспорта в CSV.
|
||||
|
||||
**Деев Егор Викторович** — [GitHub](https://github.com/EDeev) · [Telegram](https://t.me/DeevEgor) · [egor@deev.space](mailto:egor@deev.space)
|
||||
**Стек:** Flask, Flask-Login, Blueprints, CSV export
|
||||
|
||||
#### [Лабораторная работа №6](https://web-dev.deev.space/lab6)
|
||||
Доработка образовательного портала: добавление системы отзывов к курсам, рейтинговой системы, пагинации и фильтрации.
|
||||
|
||||
**Стек:** Flask, Flask-SQLAlchemy, Flask-Migrate, MySQL
|
||||
|
||||
### Домашние задания
|
||||
|
||||
#### [Домашнее задание №1](https://github.com/EDeev/web-dev/tree/main/hws/hw-1)
|
||||
Решение 20 задач на Python: базовые алгоритмы, работа с файлами, регулярные выражения, структуры данных. Покрытие тестами с использованием pytest (60+ тестов).
|
||||
|
||||
**Темы:** базовый синтаксис Python, работа с файлами, алгоритмы, структуры данных
|
||||
|
||||
#### [Домашнее задание №2](https://github.com/EDeev/web-dev/tree/main/hws/hw-2)
|
||||
Решение 17 задач на Python: функции, декораторы, генераторы, ООП, работа с файловой системой. Покрытие тестами с использованием pytest (60+ тестов).
|
||||
|
||||
**Темы:** функции, декораторы, генераторы, ООП, аргументы командной строки, работа с файлами
|
||||
|
||||
## План развития
|
||||
|
||||
- Развертывание всех лабораторных работ на хостинге
|
||||
- Добавление CI/CD pipeline для автоматического тестирования
|
||||
- Документирование API endpoints
|
||||
- Рефакторинг кода с применением паттернов проектирования
|
||||
- Добавление Docker-контейнеризации для упрощения развертывания
|
||||
|
||||
## Технологический стек
|
||||
|
||||
- **Backend:** Python, Flask, Flask-Login, Flask-SQLAlchemy, Flask-Migrate
|
||||
- **Frontend:** HTML5, CSS3, Bootstrap 5, Jinja2
|
||||
- **База данных:** MySQL, SQLite
|
||||
- **Тестирование:** pytest
|
||||
- **Деплой:** NGINX, Unit
|
||||
|
||||
## Контакты
|
||||
|
||||
- Email: egor@deev.space
|
||||
- Telegram: @Egor_Deev
|
||||
- GitHub: @EDeev
|
||||
|
||||
## Лицензия и использование
|
||||
|
||||
Данный репозиторий создан в образовательных целях. Код доступен для изучения и адаптации без указания авторства.
|
||||
|
||||
---
|
||||
|
||||
<div align="center">
|
||||
<sub>⭐ Если проект оказался полезным, поставьте звёздочку на GitHub!</sub>
|
||||
<p><sub>Сделано с ❤️ — <a href="https://deev.space">deev.space</a></sub></p>
|
||||
<sub>⭐ Если проект оказался полезным, поставьте звездочку на GitHub!</sub>
|
||||
<p><sub>Создано с ❤️ от вашего дорогого - <a href="https://deev.space">deev.space</a> ©</sub></p>
|
||||
</div>
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 127 KiB |
|
Before Width: | Height: | Size: 180 KiB |
2
ex/README.md
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
## Сайт развёрнут на домене https://ex-web.deev.su
|
||||
Тестовые аккаунты (администратор, модератор, пользователь) создаёт `ex/db/db_seed.py`; пароли задаются переменными `SEED_ADMIN_PASSWORD`, `SEED_MODER_PASSWORD`, `SEED_USER_PASSWORD` или генерируются при запуске и выводятся в консоль.
|
||||
|
|
@ -9,7 +9,7 @@ import bleach
|
|||
import markdown
|
||||
|
||||
app = Flask(__name__)
|
||||
app.secret_key = os.environ.get('SECRET_KEY', 'exam-secret-key-2026')
|
||||
app.secret_key = 'exam-secret-key-2026'
|
||||
|
||||
_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
app.config['UPLOAD_FOLDER'] = os.path.join(os.path.dirname(__file__), 'static', 'uploads')
|
||||
|
|
|
|||
5
ex/app/static/uploads/10.svg
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="280">
|
||||
<rect width="200" height="280" fill="#1cc88a"/>
|
||||
<text x="100" y="155" font-family="Arial" font-size="48" font-weight="bold"
|
||||
fill="white" text-anchor="middle">КР</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 254 B |
5
ex/app/static/uploads/11.svg
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="280">
|
||||
<rect width="200" height="280" fill="#858796"/>
|
||||
<text x="100" y="155" font-family="Arial" font-size="48" font-weight="bold"
|
||||
fill="white" text-anchor="middle">ГР</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 254 B |
5
ex/app/static/uploads/12.svg
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="280">
|
||||
<rect width="200" height="280" fill="#e74a3b"/>
|
||||
<text x="100" y="155" font-family="Arial" font-size="48" font-weight="bold"
|
||||
fill="white" text-anchor="middle">ВО</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 254 B |
5
ex/app/static/uploads/13.svg
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="280">
|
||||
<rect width="200" height="280" fill="#f6c23e"/>
|
||||
<text x="100" y="155" font-family="Arial" font-size="48" font-weight="bold"
|
||||
fill="white" text-anchor="middle">АВ</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 254 B |
BIN
ex/app/static/uploads/14.jpg
Normal file
|
After Width: | Height: | Size: 274 KiB |
BIN
ex/app/static/uploads/15.jpg
Normal file
|
After Width: | Height: | Size: 109 KiB |
BIN
ex/app/static/uploads/16.jpg
Normal file
|
After Width: | Height: | Size: 310 KiB |
BIN
ex/app/static/uploads/17.jpg
Normal file
|
After Width: | Height: | Size: 87 KiB |
BIN
ex/app/static/uploads/18.jpg
Normal file
|
After Width: | Height: | Size: 169 KiB |
BIN
ex/app/static/uploads/19.jpg
Normal file
|
After Width: | Height: | Size: 648 KiB |
5
ex/app/static/uploads/2.svg
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="280">
|
||||
<rect width="200" height="280" fill="#e74a3b"/>
|
||||
<text x="100" y="155" font-family="Arial" font-size="48" font-weight="bold"
|
||||
fill="white" text-anchor="middle">МА</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 254 B |
BIN
ex/app/static/uploads/20.jpg
Normal file
|
After Width: | Height: | Size: 863 KiB |
BIN
ex/app/static/uploads/21.jpg
Normal file
|
After Width: | Height: | Size: 252 KiB |
BIN
ex/app/static/uploads/22.jpg
Normal file
|
After Width: | Height: | Size: 236 KiB |
BIN
ex/app/static/uploads/23.jpg
Normal file
|
After Width: | Height: | Size: 1.1 MiB |
BIN
ex/app/static/uploads/24.jpg
Normal file
|
After Width: | Height: | Size: 297 KiB |
BIN
ex/app/static/uploads/25.jpg
Normal file
|
After Width: | Height: | Size: 321 KiB |
BIN
ex/app/static/uploads/26.jpg
Normal file
|
After Width: | Height: | Size: 130 KiB |
BIN
ex/app/static/uploads/27.jpg
Normal file
|
After Width: | Height: | Size: 434 KiB |
BIN
ex/app/static/uploads/28.jpg
Normal file
|
After Width: | Height: | Size: 1.2 MiB |
BIN
ex/app/static/uploads/29.jpg
Normal file
|
After Width: | Height: | Size: 132 KiB |
5
ex/app/static/uploads/3.svg
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="280">
|
||||
<rect width="200" height="280" fill="#f6c23e"/>
|
||||
<text x="100" y="155" font-family="Arial" font-size="48" font-weight="bold"
|
||||
fill="white" text-anchor="middle">19</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 252 B |
BIN
ex/app/static/uploads/30.jpg
Normal file
|
After Width: | Height: | Size: 442 KiB |
BIN
ex/app/static/uploads/31.jpg
Normal file
|
After Width: | Height: | Size: 382 KiB |
BIN
ex/app/static/uploads/32.jpg
Normal file
|
After Width: | Height: | Size: 243 KiB |
5
ex/app/static/uploads/4.svg
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="280">
|
||||
<rect width="200" height="280" fill="#4e73df"/>
|
||||
<text x="100" y="155" font-family="Arial" font-size="48" font-weight="bold"
|
||||
fill="white" text-anchor="middle">ПР</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 254 B |
5
ex/app/static/uploads/5.svg
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="280">
|
||||
<rect width="200" height="280" fill="#1cc88a"/>
|
||||
<text x="100" y="155" font-family="Arial" font-size="48" font-weight="bold"
|
||||
fill="white" text-anchor="middle">ДЮ</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 254 B |
5
ex/app/static/uploads/6.svg
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="280">
|
||||
<rect width="200" height="280" fill="#f6c23e"/>
|
||||
<text x="100" y="155" font-family="Arial" font-size="48" font-weight="bold"
|
||||
fill="white" text-anchor="middle">ГА</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 254 B |
5
ex/app/static/uploads/7.svg
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="280">
|
||||
<rect width="200" height="280" fill="#e74a3b"/>
|
||||
<text x="100" y="155" font-family="Arial" font-size="48" font-weight="bold"
|
||||
fill="white" text-anchor="middle">ТР</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 254 B |
5
ex/app/static/uploads/8.svg
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="280">
|
||||
<rect width="200" height="280" fill="#e74a3b"/>
|
||||
<text x="100" y="155" font-family="Arial" font-size="48" font-weight="bold"
|
||||
fill="white" text-anchor="middle">ШЕ</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 254 B |
5
ex/app/static/uploads/9.svg
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="280">
|
||||
<rect width="200" height="280" fill="#4e73df"/>
|
||||
<text x="100" y="155" font-family="Arial" font-size="48" font-weight="bold"
|
||||
fill="white" text-anchor="middle">ВЛ</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 254 B |
BIN
ex/db/library.db
Normal file
|
|
@ -8,4 +8,4 @@ if __name__ == '__main__':
|
|||
with app.app_context():
|
||||
if not os.path.exists(app.config['DATABASE']):
|
||||
init_db()
|
||||
app.run(debug=os.environ.get('FLASK_DEBUG') == '1')
|
||||
app.run(debug=True)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
import random
|
||||
import math
|
||||
|
||||
def circle_square_mk(r, n):
|
||||
inside = 0
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
import operator
|
||||
|
||||
def person_lister(f):
|
||||
def inner(people):
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ import pytest
|
|||
import math
|
||||
import os
|
||||
import subprocess
|
||||
import tempfile
|
||||
from fact import fact_it, fact_rec
|
||||
from show_employee import show_employee
|
||||
from sum_and_sub import sum_and_sub
|
||||
|
|
@ -10,7 +11,7 @@ from my_sum import my_sum
|
|||
from email_validation import fun
|
||||
from fibonacci import fibonacci
|
||||
from average_scores import compute_average_scores
|
||||
from plane_angle import Point
|
||||
from plane_angle import Point, plane_angle
|
||||
from complex_numbers import Complex
|
||||
from circle_square_mk import circle_square_mk
|
||||
from log_decorator import function_logger
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
import os
|
||||
import random
|
||||
from flask import Flask, render_template
|
||||
from faker import Faker
|
||||
|
|
@ -49,4 +48,4 @@ def about():
|
|||
return render_template('about.html', title='Об авторе')
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(debug=os.environ.get('FLASK_DEBUG') == '1')
|
||||
app.run(debug=True)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
import os
|
||||
import re
|
||||
import random
|
||||
from flask import Flask, render_template, request
|
||||
|
|
@ -105,4 +104,4 @@ def phone():
|
|||
)
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(debug=os.environ.get('FLASK_DEBUG') == '1')
|
||||
app.run(debug=True)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
import os
|
||||
import re
|
||||
import random
|
||||
from flask import Flask, render_template, request, session, redirect, url_for, flash
|
||||
|
|
@ -9,7 +8,7 @@ fake = Faker('ru_RU')
|
|||
|
||||
app = Flask(__name__)
|
||||
application = app
|
||||
app.secret_key = os.environ.get('SECRET_KEY', '1234567890secret')
|
||||
app.secret_key = '1234567890secret'
|
||||
|
||||
login_manager = LoginManager()
|
||||
login_manager.init_app(app)
|
||||
|
|
@ -167,4 +166,4 @@ def phone():
|
|||
)
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(debug=os.environ.get('FLASK_DEBUG') == '1')
|
||||
app.run(debug=True)
|
||||
|
|
|
|||
|
|
@ -1,8 +1,7 @@
|
|||
import os
|
||||
import re
|
||||
import random
|
||||
from datetime import datetime
|
||||
from flask import Flask, render_template, request, session, redirect, url_for, flash
|
||||
from flask import Flask, render_template, request, session, redirect, url_for, flash, abort
|
||||
from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user
|
||||
from flask_sqlalchemy import SQLAlchemy
|
||||
from flask_bcrypt import Bcrypt
|
||||
|
|
@ -12,7 +11,7 @@ fake = Faker('ru_RU')
|
|||
|
||||
app = Flask(__name__)
|
||||
application = app
|
||||
app.secret_key = os.environ.get('SECRET_KEY', '1234567890secret')
|
||||
app.secret_key = '1234567890secret'
|
||||
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
|
||||
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
|
||||
|
||||
|
|
@ -448,4 +447,4 @@ def change_password():
|
|||
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(debug=os.environ.get('FLASK_DEBUG') == '1')
|
||||
app.run(debug=True)
|
||||
|
|
|
|||
BIN
labs/lab-4/app/instance/users.db
Normal file
|
|
@ -7,7 +7,6 @@ MarkupSafe==2.1.1
|
|||
python-dateutil==2.8.2
|
||||
six==1.16.0
|
||||
Werkzeug==2.0.3
|
||||
Flask-Login==0.6.3
|
||||
Flask-SQLAlchemy==2.5.1
|
||||
SQLAlchemy==1.4.54
|
||||
Flask-Bcrypt==1.0.1
|
||||
Flask-Login
|
||||
Flask-SQLAlchemy
|
||||
Flask-Bcrypt
|
||||
|
|
@ -1,9 +1,8 @@
|
|||
import os
|
||||
import re
|
||||
import random
|
||||
from functools import wraps
|
||||
from datetime import datetime
|
||||
from flask import Flask, render_template, request, session, redirect, url_for, flash
|
||||
from flask import Flask, render_template, request, session, redirect, url_for, flash, abort
|
||||
from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user
|
||||
from flask_sqlalchemy import SQLAlchemy
|
||||
from flask_bcrypt import Bcrypt
|
||||
|
|
@ -13,7 +12,7 @@ fake = Faker('ru_RU')
|
|||
|
||||
app = Flask(__name__)
|
||||
application = app
|
||||
app.secret_key = os.environ.get('SECRET_KEY', '1234567890secret')
|
||||
app.secret_key = '1234567890secret'
|
||||
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
|
||||
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
|
||||
|
||||
|
|
@ -516,4 +515,4 @@ with app.app_context():
|
|||
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(debug=os.environ.get('FLASK_DEBUG') == '1')
|
||||
app.run(debug=True)
|
||||
|
|
|
|||
BIN
labs/lab-5/app/instance/users.db
Normal file
|
|
@ -51,7 +51,7 @@ def index():
|
|||
return redirect(url_for('index'))
|
||||
|
||||
m = _get_app_module()
|
||||
VisitLog = m.VisitLog
|
||||
db, VisitLog = m.db, m.VisitLog
|
||||
|
||||
page = request.args.get('page', 1, type=int)
|
||||
per_page = 10
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@ MarkupSafe==2.1.1
|
|||
python-dateutil==2.8.2
|
||||
six==1.16.0
|
||||
Werkzeug==2.0.3
|
||||
Flask-Login==0.6.3
|
||||
Flask-SQLAlchemy==2.5.1
|
||||
SQLAlchemy==1.4.54
|
||||
Flask-Bcrypt==1.0.1
|
||||
Flask-Login
|
||||
Flask-SQLAlchemy
|
||||
Flask-Bcrypt
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
import os
|
||||
|
||||
SECRET_KEY = os.environ.get('SECRET_KEY', 'secret-key')
|
||||
SECRET_KEY = 'secret-key'
|
||||
|
||||
SQLALCHEMY_DATABASE_URI = 'sqlite:///project.db'
|
||||
SQLALCHEMY_TRACK_MODIFICATIONS = False
|
||||
|
|
|
|||
BIN
labs/lab-6/app/instance/project.db
Normal file
|
After Width: | Height: | Size: 483 KiB |
|
After Width: | Height: | Size: 1.4 MiB |
|
After Width: | Height: | Size: 970 KiB |
|
After Width: | Height: | Size: 1.4 MiB |
|
|
@ -1,6 +1,7 @@
|
|||
import os
|
||||
from typing import Optional, List
|
||||
from typing import Optional, Union, List
|
||||
from datetime import datetime
|
||||
import sqlalchemy as sa
|
||||
from werkzeug.security import check_password_hash, generate_password_hash
|
||||
from flask_login import UserMixin
|
||||
from flask import url_for
|
||||
|
|
|
|||