<br><div class="gmail_quote">2013/4/14 Riccardo mancuso <span dir="ltr"><<a href="mailto:mancuso.riccardo63@gmail.com" target="_blank">mancuso.riccardo63@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div>vorrei imparare a sviluppare web application in Python. Poichè vorrei capire i fondamenti, ho deciso di imparare bottle,micro-web-framework, che sembra anche dagli esempi riportati nel sito di riferimento (<a href="http://bottlepy.org/docs/dev/index.html" target="_blank">http://bottlepy.org/docs/dev/index.html</a>) semplice ed essenziale. <br>


</div></blockquote></div><div><br></div>Ho dato uno sguardo al tutorial. Non mi piace Bottle.<div><br></div><div>Prendiamo questo esempio:</div><div><div class="highlight-python" style="color:rgb(17,17,17);font-family:Veranda,sans-serif;font-size:16px;line-height:22.390625px;background-color:rgb(255,255,255)">

<div class="highlight" style="background-color:transparent;background-repeat:initial initial"><pre style="overflow-x:auto;overflow-y:hidden;background-color:rgb(232,239,239);margin-right:2em;margin-left:2em;padding:0.5em;font-size:12px;line-height:1.2em">

<span class="nd" style="color:rgb(85,85,85);font-weight:bold">@route</span><span class="p">(</span><span class="s" style="color:rgb(64,112,160)">'/static/<filename:path>'</span><span class="p">)</span>
<span class="k" style="color:rgb(0,112,32);font-weight:bold">def</span> <span class="nf" style="color:rgb(6,40,126)">send_static</span><span class="p">(</span><span class="n">filename</span><span class="p">):</span>
    <span class="k" style="color:rgb(0,112,32);font-weight:bold">return</span> <span class="n">static_file</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">root</span><span class="o" style="color:rgb(102,102,102)">=</span><span class="s" style="color:rgb(64,112,160)">'/path/to/static/files'</span><span class="p">)</span></pre>

</div></div>Non mi piace che accoppi la definizione delle rotte con la definizione di come devono essere servite.</div><div>La struttura e soprattutto le stringhe usate nelle rotte potrebbero cambiare per motivi diversi da quelli che possono far cambiare le funzioni che servono il risultato. Una violazione di SRP.</div>

<div><br></div><div>L'altra cosa che non mi piace é come viene servito l'output:</div><div><br></div><div><pre style="overflow-x:auto;overflow-y:hidden;background-color:rgb(232,239,239);margin-right:2em;margin-left:2em;padding:0.5em;font-size:12px;line-height:1.2em;color:rgb(17,17,17)">

<span class="nd" style="color:rgb(85,85,85);font-weight:bold">@route</span><span class="p">(</span><span class="s" style="color:rgb(64,112,160)">'/hello'</span><span class="p">)</span>
<span class="k" style="color:rgb(0,112,32);font-weight:bold">def</span> <span class="nf" style="color:rgb(6,40,126)">hello</span><span class="p">():</span>
    <span class="k" style="color:rgb(0,112,32);font-weight:bold">return</span> <span class="s" style="color:rgb(64,112,160)">"Hello World!"</span></pre></div><div>L'output viene servito con una stringa. La stringa deve essere preparata nel corpo della funzione e infine restituito al framework che provvede a spedirlo al client. Questo vuol dire che bisogna creare prima tutto il testo della risposta e solo alla fine si può cominciare a spedire. Uno vorrebbe che si potesse spedire un po' alla volta soprattutto quando la risposta é lunga.</div>

<div><br></div><div>L'altra cosa che non mi piace é questa:</div><div><pre style="overflow-x:auto;overflow-y:hidden;background-color:rgb(232,239,239);margin-right:2em;margin-left:2em;padding:0.5em;font-size:12px;line-height:1.2em;color:rgb(17,17,17)">

<span class="nd" style="color:rgb(85,85,85);font-weight:bold">@route</span><span class="p">(</span><span class="s" style="color:rgb(64,112,160)">'/login'</span><span class="p">)</span>
<span class="k" style="color:rgb(0,112,32);font-weight:bold">def</span> <span class="nf" style="color:rgb(6,40,126)">login</span><span class="p">():</span>
    <span class="n">username</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">request</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">forms</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">get</span><span class="p">(</span><span class="s" style="color:rgb(64,112,160)">'username'</span><span class="p">)</span>
    <span class="n">password</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">request</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">forms</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">get</span><span class="p">(</span><span class="s" style="color:rgb(64,112,160)">'password'</span><span class="p">)</span>
    <span class="k" style="color:rgb(0,112,32);font-weight:bold">if</span> <span class="n">check_user_credentials</span><span class="p">(</span><span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">):</span>
        <span class="n">response</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">set_cookie</span><span class="p">(</span><span class="s" style="color:rgb(64,112,160)">"account"</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="n">secret</span><span class="o" style="color:rgb(102,102,102)">=</span><span class="s" style="color:rgb(64,112,160)">'some-secret-key'</span><span class="p">)</span>
        <span class="k" style="color:rgb(0,112,32);font-weight:bold">return</span> <span class="s" style="color:rgb(64,112,160)">"Welcome </span><span class="si" style="color:rgb(112,160,208);font-style:italic">%s</span><span class="s" style="color:rgb(64,112,160)">! You are now logged in."</span> <span class="o" style="color:rgb(102,102,102)">%</span> <span class="n">username</span>
    <span class="k" style="color:rgb(0,112,32);font-weight:bold">else</span><span class="p">:</span>
        <span class="k" style="color:rgb(0,112,32);font-weight:bold">return</span> <span class="s" style="color:rgb(64,112,160)">"Login failed."</span>
</pre><div><span class="s" style="color:rgb(64,112,160)"><br></span></div><div><font color="#4070a0">La funzione login accede a request che é una global instance. </font></div><div><font color="#4070a0">Questo vuol dire che una delle dipendenze di login() é iniettata in modo implicito.</font></div>

<div><font color="#4070a0">Questa struttura intralcia la scrittura di test automatici indipendenti perché richiedono di stubbare o mockare uno stato globale.</font></div><div><br></div><div><font color="#4070a0">Ciao</font></div>

<br clear="all"><div><br></div>-- <br>Andrea Francia <a href="http://andreafrancia.it" target="_blank">http://andreafrancia.it</a>
</div>