Webový server - rozhraní k piškvorkám

Tato lekce navazuje na dřívější úkoly - 1D piškvorky. Pokud je nemáš udělané, můžeš použít ukázkové následující soubory.

Soubor util.py musí obsahovat funkci tah(pole, index, symbol), která se pokusí umístit hráčův symbol do zadaného hracího pole a vrací nový stav hracího pole (neúspěch je indikován vyvoláním výjimky ValueError). Může vypadat například takto:

Řešení

Podobně s ai.py. Ten musí obsahovat funkci tah_pocitace(pole, symbol), který se pokusí umístit zadaný symbol do hracího pole, vrací nový stav hracího pole. použít velmi naivní strategii:

Řešení

První seznámení se serverem

Pro webový server dneska použijeme knihovnu flask. Již tradičně, nejprve si ji nainstalujeme:

(venv) $ python -m pip install flask

Začneme s jednoduchou kostrou:

# webpiskvorky.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hra():
    jmeno_zvirete = 'Andulka na bidýlku'

    return f'Ahoj, jmenuju se {jmeno_zvirete}.'

Spuštění serveru

Aplikace ve Flasku se spouští trochu jinak, než programy, které jsme si doposud napsali. Nejprve je nutné nastavit několik proměnných prostředí a to se dělá na různých počítačích jiným způsobem.

V linuxu/Mac:

$ export FLASK_APP=webpiskvorky.py
$ export FLASK_DEBUG=1

Pokud pracuješ na Windows:

> set FLASK_APP=webpiskvorky.py
> set FLASK_DEBUG=1

Tak, tím máme nachystané prostředí a konečně můžeme server spustit:

(venv) $ flask run
 * Serving Flask app "webpiskvorky.py" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 279-218-554

Otevři si v prohlížeči stránku http://127.0.0.1:5000 a mělo by se ti zobrazi prázdná stránka pouze s textem

Ahoj, jmenuju se Andulka na bidýlku.

Šablona

Psaní obsahu stránky přímo v pythonu je docela nepohodlné. Proto využijeme tzv. šablon. To je soubor, do kterého ve kterém se dají nahradit proměnné za jejich hodnoty.

Ve stejné složce, jako se nachází soubor webpiskvorky.py vytvoříme novou složku templates a v ní následující piskvorky.html:

Soubor templates/piskvorky.html:

<!DOCTYPE html>
<html>
    <head>
        <title></title>
        <meta charset="utf-8">
    </head>
    <body>
        Ahoj, jmenuju se {{ jmeno }}
    </body>
</html>

Nyní upravíme naši funkci tak, abychom šabloně předali proměnné a výsledný obsah vrátili jako odpověd serveru.

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def hra():
    jmeno_zvirete = 'Andulka na bidýlku'

    return render_template('piskvorky.html', jmeno=jmeno_zvirete)

Pojmenovaný argument funkce render_template uvnitř šablony vezme jako název proměnné uvnitř šablony. Hodnotu proměnné v šabloně vypíšeme pomocí dvojitých složených závorek.

Výsledná aplikace

Řešení

{
  "data": {
    "sessionMaterial": {
      "id": "session-material:2019/brno-jaro-2019-pondeli:tmp4:1",
      "title": "Webový server - rozhraní k piškvorkám",
      "html": "\n          \n    \n\n    <h1>Webov&#xFD; server - rozhran&#xED; k pi&#x161;kvork&#xE1;m</h1>\n<p>Tato lekce navazuje na d&#x159;&#xED;v&#x11B;j&#x161;&#xED; &#xFA;koly - 1D pi&#x161;kvorky. Pokud je nem&#xE1;&#x161; ud&#x11B;lan&#xE9;,\nm&#x16F;&#x17E;e&#x161; pou&#x17E;&#xED;t uk&#xE1;zkov&#xE9; n&#xE1;sleduj&#xED;c&#xED; soubory.</p>\n<p>Soubor <code>util.py</code> mus&#xED; obsahovat funkci <code>tah(pole, index, symbol)</code>, kter&#xE1; se\npokus&#xED; um&#xED;stit hr&#xE1;&#x10D;&#x16F;v symbol do zadan&#xE9;ho hrac&#xED;ho pole a vrac&#xED; nov&#xFD; stav hrac&#xED;ho\npole (ne&#xFA;sp&#x11B;ch je indikov&#xE1;n vyvol&#xE1;n&#xED;m v&#xFD;jimky <code>ValueError</code>). M&#x16F;&#x17E;e vypadat\nnap&#x159;&#xED;klad takto:</p>\n<div class=\"solution\" id=\"solution-0\">\n    <h3>&#x158;e&#x161;en&#xED;</h3>\n    <div class=\"solution-cover\">\n        <a href=\"/2019/brno-jaro-2019-pondeli/projects/webpiskvorky/index/solutions/0/\"><span class=\"link-text\">Uk&#xE1;zat &#x159;e&#x161;en&#xED;</span></a>\n    </div>\n    <div class=\"solution-body\" aria-hidden=\"true\">\n        <div class=\"highlight\"><pre><span></span><span class=\"c1\"># util.py</span>\n<span class=\"k\">def</span> <span class=\"nf\">tah</span><span class=\"p\">(</span><span class=\"n\">pole</span><span class=\"p\">,</span> <span class=\"n\">index</span><span class=\"p\">,</span> <span class=\"n\">symbol</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"n\">index</span> <span class=\"o\">&gt;=</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">pole</span><span class=\"p\">)</span> <span class=\"ow\">or</span> <span class=\"n\">index</span> <span class=\"o\">&lt;</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span>\n    <span class=\"k\">if</span> <span class=\"n\">pole</span><span class=\"p\">[</span><span class=\"n\">index</span><span class=\"p\">]</span> <span class=\"o\">!=</span> <span class=\"s1\">&apos;-&apos;</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span>\n    <span class=\"k\">if</span> <span class=\"n\">symbol</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"p\">(</span><span class=\"s1\">&apos;x&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;o&apos;</span><span class=\"p\">):</span>\n        <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">pole</span><span class=\"p\">[:</span><span class=\"n\">index</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">symbol</span> <span class=\"o\">+</span> <span class=\"n\">pole</span><span class=\"p\">[</span><span class=\"n\">index</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">:]</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">vyhodnot</span><span class=\"p\">(</span><span class=\"n\">pole</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"s1\">&apos;xxx&apos;</span> <span class=\"ow\">in</span> <span class=\"n\">pole</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"s1\">&apos;x&apos;</span>\n    <span class=\"k\">if</span> <span class=\"s1\">&apos;ooo&apos;</span> <span class=\"ow\">in</span> <span class=\"n\">pole</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"s1\">&apos;o&apos;</span>\n    <span class=\"k\">if</span> <span class=\"s1\">&apos;-&apos;</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"n\">pole</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"s1\">&apos;!&apos;</span>\n    <span class=\"k\">return</span> <span class=\"s1\">&apos;-&apos;</span>\n</pre></div>\n    </div>\n</div><p>Podobn&#x11B; s <code>ai.py</code>. Ten mus&#xED; obsahovat funkci <code>tah_pocitace(pole, symbol)</code>, kter&#xFD;\nse pokus&#xED; um&#xED;stit zadan&#xFD; symbol do hrac&#xED;ho pole, vrac&#xED; nov&#xFD; stav hrac&#xED;ho pole.\npou&#x17E;&#xED;t velmi naivn&#xED; strategii:</p>\n<div class=\"solution\" id=\"solution-1\">\n    <h3>&#x158;e&#x161;en&#xED;</h3>\n    <div class=\"solution-cover\">\n        <a href=\"/2019/brno-jaro-2019-pondeli/projects/webpiskvorky/index/solutions/1/\"><span class=\"link-text\">Uk&#xE1;zat &#x159;e&#x161;en&#xED;</span></a>\n    </div>\n    <div class=\"solution-body\" aria-hidden=\"true\">\n        <div class=\"highlight\"><pre><span></span><span class=\"c1\"># ai.py</span>\n<span class=\"kn\">from</span> <span class=\"nn\">random</span> <span class=\"kn\">import</span> <span class=\"n\">randrange</span>\n<span class=\"kn\">from</span> <span class=\"nn\">util</span> <span class=\"kn\">import</span> <span class=\"n\">tah</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">tah_pocitace</span><span class=\"p\">(</span><span class=\"n\">pole</span><span class=\"p\">,</span> <span class=\"n\">symbol</span><span class=\"p\">):</span>\n    <span class=\"n\">delka</span> <span class=\"o\">=</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">pole</span><span class=\"p\">)</span>\n\n    <span class=\"k\">while</span> <span class=\"bp\">True</span><span class=\"p\">:</span>\n        <span class=\"k\">try</span><span class=\"p\">:</span>\n            <span class=\"n\">index</span> <span class=\"o\">=</span> <span class=\"n\">randrange</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"n\">delka</span><span class=\"p\">)</span>\n            <span class=\"k\">return</span> <span class=\"n\">tah</span><span class=\"p\">(</span><span class=\"n\">pole</span><span class=\"p\">,</span> <span class=\"n\">index</span><span class=\"p\">,</span> <span class=\"n\">symbol</span><span class=\"p\">)</span>\n        <span class=\"k\">except</span> <span class=\"ne\">ValueError</span><span class=\"p\">:</span>\n            <span class=\"k\">pass</span>\n</pre></div>\n    </div>\n</div><h1>Prvn&#xED; sezn&#xE1;men&#xED; se serverem</h1>\n<p>Pro webov&#xFD; server dneska pou&#x17E;ijeme knihovnu <code>flask</code>. Ji&#x17E; tradi&#x10D;n&#x11B;, nejprve si ji\nnainstalujeme:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"o\">(</span>venv<span class=\"o\">)</span> $ python -m pip install flask\n</pre></div><p>Za&#x10D;neme s jednoduchou kostrou:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"c1\"># webpiskvorky.py</span>\n<span class=\"kn\">from</span> <span class=\"nn\">flask</span> <span class=\"kn\">import</span> <span class=\"n\">Flask</span>\n\n<span class=\"n\">app</span> <span class=\"o\">=</span> <span class=\"n\">Flask</span><span class=\"p\">(</span><span class=\"vm\">__name__</span><span class=\"p\">)</span>\n\n<span class=\"nd\">@app.route</span><span class=\"p\">(</span><span class=\"s1\">&apos;/&apos;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">hra</span><span class=\"p\">():</span>\n    <span class=\"n\">jmeno_zvirete</span> <span class=\"o\">=</span> <span class=\"s1\">&apos;Andulka na bid&#xFD;lku&apos;</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">f</span><span class=\"s1\">&apos;Ahoj, jmenuju se {jmeno_zvirete}.&apos;</span>\n</pre></div><h2>Spu&#x161;t&#x11B;n&#xED; serveru</h2>\n<p>Aplikace ve Flasku se spou&#x161;t&#xED; trochu jinak, ne&#x17E; programy, kter&#xE9; jsme si doposud\nnapsali.  Nejprve je nutn&#xE9; nastavit n&#x11B;kolik prom&#x11B;nn&#xFD;ch prost&#x159;ed&#xED; a to se d&#x11B;l&#xE1; na\nr&#x16F;zn&#xFD;ch po&#x10D;&#xED;ta&#x10D;&#xED;ch jin&#xFD;m zp&#x16F;sobem.</p>\n<p>V linuxu/Mac:</p>\n<div class=\"highlight\"><pre><span></span>$ <span class=\"nb\">export</span> <span class=\"nv\">FLASK_APP</span><span class=\"o\">=</span>webpiskvorky.py\n$ <span class=\"nb\">export</span> <span class=\"nv\">FLASK_DEBUG</span><span class=\"o\">=</span><span class=\"m\">1</span>\n</pre></div><p>Pokud pracuje&#x161; na Windows:</p>\n<div class=\"highlight\"><pre><span></span>&gt; <span class=\"nb\">set</span> <span class=\"nv\">FLASK_APP</span><span class=\"o\">=</span>webpiskvorky.py\n&gt; <span class=\"nb\">set</span> <span class=\"nv\">FLASK_DEBUG</span><span class=\"o\">=</span><span class=\"m\">1</span>\n</pre></div><p>Tak, t&#xED;m m&#xE1;me nachystan&#xE9; prost&#x159;ed&#xED; a kone&#x10D;n&#x11B; m&#x16F;&#x17E;eme server spustit:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"o\">(</span>venv<span class=\"o\">)</span> $ flask run\n * Serving Flask app <span class=\"s2\">&quot;webpiskvorky.py&quot;</span> <span class=\"o\">(</span>lazy loading<span class=\"o\">)</span>\n * Environment: production\n   WARNING: Do not use the development server in a production environment.\n   Use a production WSGI server instead.\n * Debug mode: on\n * Running on http://127.0.0.1:5000/ <span class=\"o\">(</span>Press CTRL+C to quit<span class=\"o\">)</span>\n * Restarting with stat\n * Debugger is active!\n * Debugger PIN: <span class=\"m\">279</span>-218-554\n</pre></div><p>Otev&#x159;i si v prohl&#xED;&#x17E;e&#x10D;i str&#xE1;nku <a href=\"http://127.0.0.1:5000\">http://127.0.0.1:5000</a> a m&#x11B;lo by se ti zobrazi\npr&#xE1;zdn&#xE1; str&#xE1;nka pouze s textem</p>\n<div class=\"highlight\"><pre><code>Ahoj, jmenuju se Andulka na bid&#xFD;lku.</code></pre></div><h2>&#x160;ablona</h2>\n<p>Psan&#xED; obsahu str&#xE1;nky p&#x159;&#xED;mo v pythonu je docela nepohodln&#xE9;. Proto vyu&#x17E;ijeme tzv.\n&#x161;ablon. To je soubor, do kter&#xE9;ho ve kter&#xE9;m se daj&#xED; nahradit prom&#x11B;nn&#xE9; za jejich\nhodnoty.</p>\n<p>Ve stejn&#xE9; slo&#x17E;ce, jako se nach&#xE1;z&#xED; soubor <code>webpiskvorky.py</code> vytvo&#x159;&#xED;me novou\nslo&#x17E;ku <code>templates</code> a v n&#xED; n&#xE1;sleduj&#xED;c&#xED; <code>piskvorky.html</code>:</p>\n<p>Soubor <code>templates/piskvorky.html</code>:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"cp\">&lt;!DOCTYPE html&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">html</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">head</span><span class=\"p\">&gt;</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">title</span><span class=\"p\">&gt;&lt;/</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">meta</span> <span class=\"na\">charset</span><span class=\"o\">=</span><span class=\"s\">&quot;utf-8&quot;</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;/</span><span class=\"nt\">head</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">body</span><span class=\"p\">&gt;</span>\n        Ahoj, jmenuju se {{ jmeno }}\n    <span class=\"p\">&lt;/</span><span class=\"nt\">body</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">html</span><span class=\"p\">&gt;</span>\n</pre></div><p>Nyn&#xED; uprav&#xED;me na&#x161;i funkci tak, abychom &#x161;ablon&#x11B; p&#x159;edali prom&#x11B;nn&#xE9; a v&#xFD;sledn&#xFD; obsah\nvr&#xE1;tili jako odpov&#x11B;d serveru.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"kn\">from</span> <span class=\"nn\">flask</span> <span class=\"kn\">import</span> <span class=\"n\">Flask</span><span class=\"p\">,</span> <span class=\"n\">render_template</span>\n\n<span class=\"n\">app</span> <span class=\"o\">=</span> <span class=\"n\">Flask</span><span class=\"p\">(</span><span class=\"vm\">__name__</span><span class=\"p\">)</span>\n\n<span class=\"nd\">@app.route</span><span class=\"p\">(</span><span class=\"s1\">&apos;/&apos;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">hra</span><span class=\"p\">():</span>\n    <span class=\"n\">jmeno_zvirete</span> <span class=\"o\">=</span> <span class=\"s1\">&apos;Andulka na bid&#xFD;lku&apos;</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">render_template</span><span class=\"p\">(</span><span class=\"s1\">&apos;piskvorky.html&apos;</span><span class=\"p\">,</span> <span class=\"n\">jmeno</span><span class=\"o\">=</span><span class=\"n\">jmeno_zvirete</span><span class=\"p\">)</span>\n</pre></div><p>Pojmenovan&#xFD; argument funkce <code>render_template</code> uvnit&#x159; &#x161;ablony vezme jako n&#xE1;zev\nprom&#x11B;nn&#xE9; uvnit&#x159; &#x161;ablony. Hodnotu prom&#x11B;nn&#xE9; v &#x161;ablon&#x11B; vyp&#xED;&#x161;eme pomoc&#xED; dvojit&#xFD;ch\nslo&#x17E;en&#xFD;ch z&#xE1;vorek.</p>\n<h2>V&#xFD;sledn&#xE1; aplikace</h2>\n<div class=\"solution\" id=\"solution-2\">\n    <h3>&#x158;e&#x161;en&#xED;</h3>\n    <div class=\"solution-cover\">\n        <a href=\"/2019/brno-jaro-2019-pondeli/projects/webpiskvorky/index/solutions/2/\"><span class=\"link-text\">Uk&#xE1;zat &#x159;e&#x161;en&#xED;</span></a>\n    </div>\n    <div class=\"solution-body\" aria-hidden=\"true\">\n        <div class=\"highlight\"><pre><span></span><span class=\"c1\"># webpiskvorky.py</span>\n\n<span class=\"c1\"># Spou&#x161;t&#x11B;n&#xED; (v p&#x159;&#xED;kazov&#xE9; &#x159;&#xE1;dce):</span>\n<span class=\"c1\"># export FLASK_APP=webpiskvorky.py</span>\n<span class=\"c1\"># export FLASK_DEBUG=1</span>\n<span class=\"c1\"># flask run</span>\n\n<span class=\"c1\"># (na Windows &quot;set&quot; m&#xED;sto &quot;export&quot;)</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">flask</span> <span class=\"kn\">import</span> <span class=\"n\">Flask</span><span class=\"p\">,</span> <span class=\"n\">render_template</span><span class=\"p\">,</span> <span class=\"n\">request</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">util</span> <span class=\"kn\">import</span> <span class=\"n\">tah</span>\n<span class=\"kn\">from</span> <span class=\"nn\">ai</span> <span class=\"kn\">import</span> <span class=\"n\">tah_pocitace</span>\n\n<span class=\"n\">app</span> <span class=\"o\">=</span> <span class=\"n\">Flask</span><span class=\"p\">(</span><span class=\"vm\">__name__</span><span class=\"p\">)</span>\n\n<span class=\"nd\">@app.route</span><span class=\"p\">(</span><span class=\"s1\">&apos;/&apos;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">hra</span><span class=\"p\">():</span>\n    <span class=\"k\">if</span> <span class=\"s1\">&apos;pole&apos;</span> <span class=\"ow\">in</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">args</span><span class=\"p\">:</span>\n        <span class=\"n\">pole</span> <span class=\"o\">=</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">args</span><span class=\"p\">[</span><span class=\"s1\">&apos;pole&apos;</span><span class=\"p\">]</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"n\">pole</span> <span class=\"o\">=</span> <span class=\"s1\">&apos;-&apos;</span> <span class=\"o\">*</span> <span class=\"mi\">20</span>\n    <span class=\"k\">if</span> <span class=\"s1\">&apos;cislo&apos;</span> <span class=\"ow\">in</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">args</span><span class=\"p\">:</span>\n        <span class=\"n\">cislo_policka</span> <span class=\"o\">=</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">args</span><span class=\"p\">[</span><span class=\"s1\">&apos;cislo&apos;</span><span class=\"p\">])</span>\n        <span class=\"n\">pole</span> <span class=\"o\">=</span> <span class=\"n\">tah</span><span class=\"p\">(</span><span class=\"n\">pole</span><span class=\"p\">,</span> <span class=\"n\">cislo_policka</span><span class=\"p\">,</span> <span class=\"s1\">&apos;x&apos;</span><span class=\"p\">)</span>\n        <span class=\"n\">pole</span> <span class=\"o\">=</span> <span class=\"n\">tah_pocitace</span><span class=\"p\">(</span><span class=\"n\">pole</span><span class=\"p\">,</span> <span class=\"s1\">&apos;o&apos;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">render_template</span><span class=\"p\">(</span>\n        <span class=\"s1\">&apos;hra.html&apos;</span><span class=\"p\">,</span>\n        <span class=\"n\">ocislovane_pole</span><span class=\"o\">=</span><span class=\"nb\">enumerate</span><span class=\"p\">(</span><span class=\"n\">pole</span><span class=\"p\">),</span>\n        <span class=\"n\">pole</span><span class=\"o\">=</span><span class=\"n\">pole</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n</pre></div><div class=\"highlight\"><pre><span></span><span class=\"cp\">&lt;!DOCTYPE html&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">html</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">head</span><span class=\"p\">&gt;</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span>Pi&#x161;kvorky<span class=\"p\">&lt;/</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">meta</span> <span class=\"na\">charset</span><span class=\"o\">=</span><span class=\"s\">&quot;utf-8&quot;</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;/</span><span class=\"nt\">head</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">body</span><span class=\"p\">&gt;</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span>Pi&#x161;kvorky<span class=\"p\">&lt;/</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">form</span><span class=\"p\">&gt;</span>\n            <span class=\"p\">&lt;</span><span class=\"nt\">input</span> <span class=\"na\">type</span><span class=\"o\">=</span><span class=\"s\">&quot;hidden&quot;</span> <span class=\"na\">name</span><span class=\"o\">=</span><span class=\"s\">&quot;pole&quot;</span> <span class=\"na\">value</span><span class=\"o\">=</span><span class=\"s\">&quot;{{ pole }}&quot;</span><span class=\"p\">&gt;</span>\n            <span class=\"p\">&lt;</span><span class=\"nt\">div</span><span class=\"p\">&gt;</span>\n                {% for cislo, znak in ocislovane_pole %}\n                    {% if znak == &apos;-&apos; %}\n                        <span class=\"p\">&lt;</span><span class=\"nt\">input</span> <span class=\"na\">type</span><span class=\"o\">=</span><span class=\"s\">&quot;radio&quot;</span> <span class=\"na\">name</span><span class=\"o\">=</span><span class=\"s\">&quot;cislo&quot;</span> <span class=\"na\">value</span><span class=\"o\">=</span><span class=\"s\">&quot;{{ cislo }}&quot;</span><span class=\"p\">&gt;</span>\n                    {% else %}\n                        {{ znak }}\n                    {% endif %}\n                {% endfor %}\n            <span class=\"p\">&lt;/</span><span class=\"nt\">div</span><span class=\"p\">&gt;</span>\n            <span class=\"p\">&lt;</span><span class=\"nt\">input</span> <span class=\"na\">type</span><span class=\"o\">=</span><span class=\"s\">&quot;submit&quot;</span> <span class=\"na\">value</span><span class=\"o\">=</span><span class=\"s\">&quot;Odeslat!&quot;</span><span class=\"p\">&gt;</span>\n        <span class=\"p\">&lt;/</span><span class=\"nt\">form</span><span class=\"p\">&gt;</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;{{ url_for(&apos;hra&apos;) }}&quot;</span><span class=\"p\">&gt;</span>Reset<span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;/</span><span class=\"nt\">body</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">html</span><span class=\"p\">&gt;</span>\n</pre></div>\n    </div>\n</div>\n\n\n        "
    }
  }
}