- HTML 56.2%
- Python 40.7%
- CSS 2%
- Dockerfile 0.7%
- Mako 0.4%
| instance | ||
| migrations | ||
| static | ||
| templates | ||
| translations | ||
| .gitignore | ||
| app.py | ||
| babel.cfg | ||
| compile_translations.py | ||
| compile_translations_cmd.py | ||
| docker-compose.yml | ||
| Dockerfile | ||
| env.sample | ||
| env.sapmle | ||
| GEOGUESSR_SETUP.md | ||
| README.md | ||
| requirements.txt | ||
| run_compile_translations.py | ||
| ssl-cert.txt | ||
| todo.txt | ||
Todo App с AdminLTE.
Веб-приложение для управления задачами (TODO) с красивым интерфейсом на базе AdminLTE и REST API.
🚀 Функциональность
- ✅ Создание, чтение, обновление и удаление задач (CRUD)
- ✅ Красивый веб-интерфейс на базе AdminLTE v4
- ✅ REST API с полной документацией Swagger UI
- ✅ SQLite/PostgreSQL база данных
- ✅ Дашборд со статистикой задач
- ✅ Адаптивный дизайн
📋 Требования
- Python 3.8+
- pip
🛠 Установка
Способ 1: Docker (Рекомендуется)
Требования
- Docker
- Docker Compose
Быстрый старт с Docker Compose
-
Клонируйте репозиторий:
git clone <repository-url> cd flask_adminlte_app -
Создайте
.envфайл:cp .env.sample .envОтредактируйте
.envфайл:SECRET_KEY=your-super-secret-key-change-in-production -
Запустите приложение с Docker Compose:
docker-compose up -dПриложение будет доступно по адресу: http://localhost:5000/dashboard
Команды Docker Compose
# Запуск в фоновом режиме
docker-compose up -d
# Остановка
docker-compose down
# Просмотр логов
docker-compose logs -f
# Пересборка после изменений
docker-compose up -d --build
# Выполнение команд в контейнере
docker-compose exec todo-app flask db upgrade
docker-compose exec todo-app flask db migrate -m "Your migration message"
Способ 2: Локальная установка
Требования
- Python 3.8+
- pip
-
Клонируйте репозиторий:
git clone <repository-url> cd flask_adminlte_app -
Создайте виртуальное окружение:
# Linux/Mac python3 -m venv env-lin source env-lin/bin/activate # Windows python -m venv env-win source env-win/Scripts/activate -
Установите зависимости:
pip install -r requirements.txt -
Настройте переменные окружения:
Создайте файл
.envна основеenv.sapmle:cp env.sapmle .envОтредактируйте
.envфайл:FLASK_APP=app.py FLASK_ENV=development SECRET_KEY=your-secret-key-here # Для SQLite (по умолчанию): DATABASE_URL=sqlite:///todo.db # Для PostgreSQL: # DATABASE_URL=postgresql://username:password@localhost/todo_db -
Запустите приложение:
python app.py или flask run --host=0.0.0.0 --port=5000
📖 Использование
Веб-интерфейс
- Главная страница: http://localhost:5000/dashboard
- Дашборд: Просмотр статистики и списка всех задач
- Создание задачи:
/todo/new- форма для добавления новой задачи - Редактирование:
/todo/<id>/edit- редактирование существующей задачи - Удаление:
/todo/<id>/delete- удаление задачи - Переключение статуса:
/todo/<id>/toggle- отметка задачи как выполненной/невыполненной
REST API
API доступно по адресу: http://localhost:5000/api/todos/
Эндпоинты:
GET /api/todos/- Получить все задачиPOST /api/todos/- Создать новую задачуGET /api/todos/<id>/- Получить задачу по IDPUT /api/todos/<id>/- Обновить задачуDELETE /api/todos/<id>/- Удалить задачу
Примеры использования API:
Создание задачи:
curl -X POST http://localhost:5000/api/todos/ \
-H "Content-Type: application/json" \
-d '{"title": "Моя задача", "description": "Описание задачи", "completed": false}'
Получение всех задач:
curl http://localhost:5000/api/todos/
Документация API
Полная интерактивная документация API доступна через Swagger UI:
- Swagger UI: http://localhost:5000/api/docs
🗄 Модель данных
Todo
id(Integer): Уникальный идентификаторtitle(String, required): Заголовок задачиdescription(String, optional): Описание задачиcompleted(Boolean): Статус выполненияcreated_at(DateTime): Дата созданияupdated_at(DateTime): Дата последнего обновленияdue_date(DateTime, optional): Дата выполнения задачи
🔄 Миграция базы данных
При изменении модели данных (добавлении полей, изменении типов) необходимо выполнить миграцию базы данных.
Способ 1: Автоматическая миграция (рекомендуется)
-
Установите Flask-Migrate:
pip install Flask-Migrate -
Инициализируйте миграции:
flask db init -
Создайте миграцию:
flask db migrate -m "Add due_date field to Todo model" -
Примените миграцию:
flask db upgrade
Примечание: Убедитесь, что переменная окружения FLASK_APP установлена:
export FLASK_APP=app.py # Linux/Mac
# или
set FLASK_APP=app.py # Windows
Способ 2: Ручная миграция для SQLite
Если Flask-Migrate не используется, можно добавить столбцы вручную:
python -c "
import sqlite3
conn = sqlite3.connect('instance/todo.db')
cursor = conn.cursor()
cursor.execute('ALTER TABLE todo ADD COLUMN due_date TIMESTAMP')
conn.commit()
conn.close()
print('Миграция завершена')
"
🏗 Архитектура проекта
flask_adminlte_app/
├── app.py # Основное приложение Flask
├── requirements.txt # Зависимости Python
├── .env # Переменные окружения
├── static/ # Статические файлы
│ ├── css/
│ ├── js/
│ └── assets/
├── templates/ # HTML шаблоны
│ ├── base.html # Базовый шаблон
│ ├── index.html # Главная страница
│ └── todo_form.html # Форма задачи
└── README.md # Эта документация
🛡 Безопасность
- CSRF защита включена
- Валидация входных данных
- Защита от SQL-инъекций через SQLAlchemy ORM
📱 Адаптивность
Приложение полностью адаптивно и корректно работает на:
- 📱 Мобильных устройствах
- 📺 Планшетах
- 💻 Настольных компьютерах
🔧 Настройка
Смена базы данных
SQLite (по умолчанию)
SQLite используется по умолчанию и не требует дополнительной настройки.
PostgreSQL с Docker
Для использования PostgreSQL раскомментируйте секцию postgres в docker-compose.yml:
postgres:
image: postgres:15-alpine
environment:
POSTGRES_DB: todo_db
POSTGRES_USER: todo_user
POSTGRES_PASSWORD: todo_password
volumes:
- postgres_data:/var/lib/postgresql/data
restart: unless-stopped
networks:
- todo-network
И добавьте в volumes:
volumes:
postgres_data:
Затем обновите переменную DATABASE_URL в .env:
DATABASE_URL=postgresql://todo_user:todo_password@postgres:5432/todo_db
PostgreSQL локально
- Установите PostgreSQL
- Создайте базу данных:
createdb todo_db - Обновите
.envфайл:DATABASE_URL=postgresql://username:password@localhost/todo_db - Перезапустите приложение
Режимы работы
- Development:
FLASK_ENV=development(с отладкой) - Production:
FLASK_ENV=production(без отладки)
Docker продвинутые настройки
Кастомные переменные окружения
Создайте файл .env для настройки:
# Flask настройки
FLASK_APP=app.py
FLASK_ENV=production
SECRET_KEY=your-super-secret-key-change-in-production
# База данных
DATABASE_URL=sqlite:///instance/todo.db
# Дополнительные настройки
BABEL_DEFAULT_LOCALE=ru
BABEL_SUPPORTED_LOCALES=ru,en
Масштабирование
Для запуска нескольких экземпляров приложения:
version: '3.8'
services:
todo-app:
build: .
ports:
- "5000-5002:5000" # Диапазон портов
deploy:
replicas: 3
environment:
- FLASK_APP=app.py
- FLASK_ENV=production
- SECRET_KEY=${SECRET_KEY}
- DATABASE_URL=postgresql://todo_user:todo_password@postgres:5432/todo_db
depends_on:
- postgres
restart: unless-stopped
networks:
- todo-network
postgres:
image: postgres:15-alpine
environment:
POSTGRES_DB: todo_db
POSTGRES_USER: todo_user
POSTGRES_PASSWORD: todo_password
volumes:
- postgres_data:/var/lib/postgresql/data
restart: unless-stopped
networks:
- todo-network
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
- todo-app
restart: unless-stopped
networks:
- todo-network
networks:
todo-network:
driver: bridge
volumes:
postgres_data:
Nginx конфигурация (nginx.conf)
events {
worker_connections 1024;
}
http {
upstream todo_app {
server todo-app:5000;
server todo-app:5001;
server todo-app:5002;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://todo_app;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /api/docs {
proxy_pass http://todo_app;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
Локализация (i18n)
Приложение поддерживает интернационализацию и поставляется с русским и английским языками по умолчанию.
Добавление нового языка (например, немецкого)
-
Установите инструмент локализации:
pip install Babel -
Извлеките сообщения для перевода:
pybabel extract -F babel.cfg -o messages.pot . -
Создайте каталог для нового языка:
pybabel init -i messages.pot -d translations -l de -
Отредактируйте файл перевода: Откройте
translations/de/LC_MESSAGES/messages.poи добавьте переводы для каждого msgid:msgid "Home" msgstr "Startseite" msgid "Dashboard" msgstr "Dashboard" msgid "Language" msgstr "Sprache" msgid "Theme" msgstr "Thema" msgid "Dark" msgstr "Dunkel" msgid "Light" msgstr "Hell" msgid "Pagination" msgstr "Paginierung" msgid "per page" msgstr "pro Seite" msgid "Todo App" msgstr "Todo-App" msgid "Todos" msgstr "Aufgaben" msgid "All Todos" msgstr "Alle Aufgaben" msgid "Add Todo" msgstr "Aufgabe hinzufügen" msgid "API Docs" msgstr "API-Dokumentation" -
Скомпилируйте переводы:
pybabel compile -d translations -
Добавьте новый язык в конфигурацию приложения: В файле
app.pyобновите настройки Babel:app.config['BABEL_SUPPORTED_LOCALES'] = ['ru', 'en', 'de'] # Добавьте 'de' -
Добавьте опцию языка в шаблоне: В файле
templates/base.htmlдобавьте ссылку на немецкий язык:<li><a href="{{ url_for('set_language', lang='de') }}" class="dropdown-item{% if session.get('language', 'ru') == 'de' %} active{% endif %}"><i class="bi bi-check-circle-fill me-2{% if session.get('language', 'ru') != 'de' %} d-none{% endif %}"></i>Deutsch</a></li> -
Перезапустите приложение:
python app.py
Теперь немецкий язык будет доступен в меню "Options" -> "Language".
🌐 Компиляция файлов перевода
Для корректной работы локализации необходимо скомпилировать файлы перевода из формата .po в формат .mo:
Установка Babel (если не установлен)
pip install Babel
Компиляция переводов
# Компиляция всех файлов перевода
pybabel compile -d translations -D messages
# Альтернативно, можно использовать команду с указанием конкретного каталога
pybabel compile -d translations
Обновление файлов перевода (если были изменения в шаблонах)
Если вы добавили новые строки для перевода в шаблонах, выполните следующие шаги:
-
Извлечение сообщений:
pybabel extract -F babel.cfg -o translations/messages.pot . -
Обновление существующих файлов перевода:
pybabel update -i translations/messages.pot -d translations -
Редактирование файлов перевода: Откройте файлы
translations/ru/LC_MESSAGES/messages.poиtranslations/en/LC_MESSAGES/messages.poи добавьте недостающие переводы. -
Компиляция файлов перевода:
pybabel compile -d translations -D messages
После компиляции файлов перевода изменения в локализации станут доступны в приложении. Убедитесь, что перезапустили сервер приложений после компиляции файлов перевода.
🐛 Решение проблем
Ошибка подключения к базе данных
- Проверьте корректность
DATABASE_URLв.env - Убедитесь, что PostgreSQL сервер запущен (если используется PostgreSQL)
Статические файлы не загружаются
- Проверьте, что файлы AdminLTE скопированы в папку
static/ - Убедитесь в корректности путей в шаблонах
API возвращает 404
- Проверьте, что приложение запущено
- Убедитесь, что используете правильные URL эндпоинтов
🤝 Вклад в проект
- Форкните проект
- Создайте ветку для вашей фичи:
git checkout -b feature/amazing-feature - Зафиксируйте изменения:
git commit -m 'Add amazing feature' - Отправьте изменения:
git push origin feature/amazing-feature - Создайте Pull Request
📄 Лицензия
Этот проект распространяется под лицензией MIT. Подробности в файле LICENSE.
🙏 Благодарности
- AdminLTE - Отличный бесплатный шаблон админ-панели
- Documentation - Документация по версии 3.1
- Flask - Легковесный веб-фреймворк
- Flask-RESTX - Расширение для создания REST API
- SQLAlchemy - ORM для работы с базами данных