{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "11640a8f",
   "metadata": {},
   "source": [
    "# 22-13 · POST-Redirect-GET\n",
    "\n",
    "Praktyka do sekcji [„HTML-forms i wysyłanie danych do serwera”"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9ae8a354",
   "metadata": {},
   "source": [
    "## Cel\n",
    "\n",
    "Upewnij się, że obsługa formularza odpowiada przekierowaniem (kod 303 See Other), a nie od razu gotową stroną."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c267dbb3",
   "metadata": {},
   "source": [
    "## Sprawa robocza"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5c5a9a56",
   "metadata": {},
   "outputs": [],
   "source": [
    "from flask import Flask, redirect, request, url_for\n",
    "\n",
    "app = Flask(__name__)\n",
    "zapisi = []\n",
    "\n",
    "\n",
    "@app.route(\"/\")\n",
    "def glavnaya():\n",
    "    return f\"Записей: {len(zapisi)}\"\n",
    "\n",
    "\n",
    "@app.route(\"/dobavit\", methods=[\"POST\"])\n",
    "def dobavit():\n",
    "    tekst = request.form.get(\"tekst\", \"\").strip()\n",
    "    if tekst:\n",
    "        zapisi.append(tekst)\n",
    "    # code=303 (See Other) dokładniejsze niż domyślne przekierowanie Flask (302\n",
    "    # Found), opisuje POST-Redirect-GET: wynik zobacz inaczej\n",
    "    # adresować przez GET.\n",
    "    return redirect(url_for(\"glavnaya\"), code=303)\n",
    "\n",
    "\n",
    "client = app.test_client()\n",
    "otvet = client.post(\"/dobavit\", data={\"tekst\": \"Первая запись\"})\n",
    "\n",
    "print(\"Код ответа:\", otvet.status_code)\n",
    "print(\"Заголовок Location:\", otvet.headers.get(\"Location\"))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ff572213",
   "metadata": {},
   "source": [
    "## Sprawdzenie wyniku"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "67a6651e",
   "metadata": {},
   "outputs": [],
   "source": [
    "assert otvet.status_code == 303\n",
    "assert otvet.headers.get(\"Location\") is not None\n",
    "assert zapisi == [\"Первая запись\"]\n",
    "print(\"Верно: POST ответил редиректом 303, а не HTML-страницей напрямую.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a031fafc",
   "metadata": {},
   "source": [
    "## Zadanie niezależne od zadania ★★\n",
    "\n",
    "Postępuj ręcznie zgodnie z przekierowaniem: GET adres z nagłówka Location i upewnij się, że pokazuje aktualną liczbę rekordów."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0785e0c4",
   "metadata": {},
   "outputs": [],
   "source": [
    "otvet_posle_redirecta = client.get(otvet.headers[\"Location\"])\n",
    "telo = otvet_posle_redirecta.get_data(as_text=True)\n",
    "\n",
    "assert \"Записей: 1\" in telo\n",
    "print(\"Верно: страница после редиректа показывает уже обновлённые данные.\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Cartesian Python 3.14",
   "language": "python",
   "name": "cartesian-python314"
  },
  "language_info": {
   "name": "python",
   "version": "3.14.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
