diff --git a/README.md b/README.md new file mode 100644 index 0000000..17cd4d8 --- /dev/null +++ b/README.md @@ -0,0 +1,50 @@ +# Flask CRUD Example + +CRUD-интерфейс на Flask + PostgreSQL. Аналог Lucee CRUD (`tfluceecrud`), работает с той же таблицей. + +## Переменные окружения + +| Переменная | По умолчанию | Назначение | +|-------------|---------------|---------------------------| +| `PGHOST` | `127.0.0.1` | Хост PostgreSQL | +| `PGPORT` | `5432` | Порт PostgreSQL | +| `PGDATABASE`| `postgres` | Имя БД | +| `PGUSER` | `postgres` | Пользователь | +| `PGPASSWORD`| (пусто) | Пароль | +| `TABLE_NAME`| `crud_items` | Имя таблицы (та же что у Lucee) | +| `PORT` | `5000` | Порт веб-сервера | + +## Запуск + +```bash +pip install -r requirements.txt +python app.py +``` + +Или через gunicorn: + +```bash +gunicorn app:app -b 0.0.0.0:5000 +``` + +При старте: `CREATE TABLE IF NOT EXISTS` — **не дропает** существующую таблицу. + +## Структура + +``` +. +├── app.py # Flask приложение +├── requirements.txt # Flask, psycopg2-binary, gunicorn +├── static/ +│ ├── logo.svg # Nubes логотип +│ ├── favicon.svg # Nudes иконка +│ └── style.css # Nubes дизайн-система +└── templates/ + └── index.html # Jinja2 шаблон +``` + +## Безопасность + +- Параметризованные запросы (`%s`) → защита от SQL-инъекций +- `redirect` после POST → защита от повторной отправки +- Jinja2 автоэкранирование → XSS-защита diff --git a/app.py b/app.py index 3ff301b..302f679 100644 --- a/app.py +++ b/app.py @@ -86,7 +86,7 @@ def index(): return redirect(url_for("index")) # --- GET: список + форма редактирования --- - edit_row = {} + edit_row = None edit_id = request.args.get("edit") if edit_id: cur.execute( @@ -112,5 +112,6 @@ def index(): if __name__ == "__main__": - init_db() + with app.app_context(): + init_db() app.run(host="0.0.0.0", port=int(os.environ.get("PORT", 5000)), debug=False)