fix: edit_row default {} → None (Jinja2 truthy bug), init_db with app_context, add README
This commit is contained in:
@@ -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-защита
|
||||||
@@ -86,7 +86,7 @@ def index():
|
|||||||
return redirect(url_for("index"))
|
return redirect(url_for("index"))
|
||||||
|
|
||||||
# --- GET: список + форма редактирования ---
|
# --- GET: список + форма редактирования ---
|
||||||
edit_row = {}
|
edit_row = None
|
||||||
edit_id = request.args.get("edit")
|
edit_id = request.args.get("edit")
|
||||||
if edit_id:
|
if edit_id:
|
||||||
cur.execute(
|
cur.execute(
|
||||||
@@ -112,5 +112,6 @@ def index():
|
|||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
with app.app_context():
|
||||||
init_db()
|
init_db()
|
||||||
app.run(host="0.0.0.0", port=int(os.environ.get("PORT", 5000)), debug=False)
|
app.run(host="0.0.0.0", port=int(os.environ.get("PORT", 5000)), debug=False)
|
||||||
|
|||||||
Reference in New Issue
Block a user