{"id":22773,"date":"2016-01-17T20:16:05","date_gmt":"2016-01-17T20:16:05","guid":{"rendered":"http:\/\/www.inacreditavel.pt\/?p=22773"},"modified":"2016-01-17T20:30:37","modified_gmt":"2016-01-17T20:30:37","slug":"python-ii","status":"publish","type":"post","link":"http:\/\/www.inacreditavel.pt\/?p=22773","title":{"rendered":"Python II"},"content":{"rendered":"<p>Entretanto, depois de <a href=\"http:\/\/www.inacreditavel.pt\/?p=22771\">ler o manual com a sintaxe de base<\/a>, pesquisei para ver como escrever programas em Python para a Web. E fiquei desiludido. O Python \u00e9 como o Perl e o Java, etc. O HTML \u00e9 gerado em c\u00f3digo, \u00e9 sempre processado. Isso fica mais pesado para o servidor.<\/p>\n<p>No <a href=\"https:\/\/www.python.org\/\">site do Python<\/a>, apresentam v\u00e1rias solu\u00e7\u00f5es para <a href=\"https:\/\/docs.python.org\/2\/howto\/webservers.html\">integrar o Python no Apache<\/a>: CGI, mod_python, FastCGI, SCGI, mod_wsgi e WSGI. Este \u00faltimo parece ser a solu\u00e7\u00e3o mais leve e funcional, mas com tanta literatura e refer\u00eancias a frameworks, decidi testar a vers\u00e3o mais simples: o CGI.<\/p>\n<p>Ainda sobre o HowTo do Python acerca de Web Servers: o documento perde-se com considera\u00e7\u00f5es sobre persist\u00eancia de dados, caching, programas que n\u00e3o correm como era esperado, falta de escalabilidade, frameworks para poder gerir projetos em MVC, etc. Coisas que o PHP j\u00e1 resolveu h\u00e1 mais de 15 anos. Ali\u00e1s, nunca vi refer\u00eancias a esses problemas na documenta\u00e7\u00e3o do PHP. Fiquei desiludido.<\/p>\n<p>Mas quis testar o Python no Apache e configurei este \u00faltimo, numa m\u00e1quina de testes, para correr o Python como CGI.<\/p>\n<p>No ficheiro httpd.conf, descomentei a linha que inibe o uso do CGI<\/p>\n<pre>\r\nLoadModule cgi_module lib64\/httpd\/modules\/mod_cgi.so\r\n<\/pre>\n<p>e acrescentei as linhas seguintes na configura\u00e7\u00e3o da diretoria do CGI<\/p>\n<pre>\r\n&lt;Directory \"\/srv\/httpd\/cgi-bin\"&gt;\r\n    Options +ExecCGI\r\n    DirectoryIndex index.py\r\n&lt;\/Directory&gt;\r\nAddHandler cgi-script .py\r\n<\/pre>\n<p>Depois, criei os dois programas seguintes, na diretoria <strong>\/srv\/httpd\/cgi-bin<\/strong> aos quais foi necess\u00e1rio dar permiss\u00f5es de execu\u00e7\u00e3o:<\/p>\n<pre>\r\nchmod 755 \/srv\/httpd\/cgi-bin\/fatorial.py\r\nchmod 755 \/srv\/httpd\/cgi-bin\/form.py\r\n<\/pre>\n<p><strong>\/srv\/httpd\/cgi-bin\/fatorial.py<\/strong><\/p>\n<pre>\r\n#!\/usr\/bin\/python\r\n\r\nimport cgi\r\nimport cgitb; cgitb.enable()  # for troubleshooting\r\n\r\nprint \"Content-type: text\/html\"\r\nprint\r\n\r\nprint \"\"\"\r\n&lt;html&gt;\r\n&lt;head&gt;&lt;title&gt;Fatorial em Python&lt;\/title&gt;&lt;\/head&gt;\r\n&lt;body&gt;\r\n  &lt;h3&gt; Fatorial em Python &lt;\/h3&gt;\r\n\"\"\"\r\n\r\ndef mul(x,y): return x*y\r\n\r\ndef fat(w): return reduce(mul, range(1,w+1))\r\n\r\ndef prt(x): print fat(x)\r\n\r\nmap(prt, range(2,11))\r\n\r\nprint \"\"\"\r\n\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;\r\n\"\"\"\r\n<\/pre>\n<p><strong>\/srv\/httpd\/cgi-bin\/form.py<\/strong><\/p>\n<pre>\r\n#!\/usr\/bin\/python\r\n\r\nimport cgi\r\nimport cgitb; cgitb.enable()  # for troubleshooting\r\n\r\nprint \"Content-type: text\/html\"\r\nprint\r\n\r\nprint \"\"\"\r\n&lt;html&gt;\r\n&lt;head&gt;&lt;title&gt;Sample CGI Script&lt;\/title&gt;&lt;\/head&gt;\r\n&lt;body&gt;\r\n  &lt;h3&gt; Sample CGI Script &lt;\/h3&gt;\r\n\"\"\"\r\n\r\nform = cgi.FieldStorage()\r\nmessage = form.getvalue(\"message\", \"(no message)\")\r\n\r\nprint \"\"\"\r\n  &lt;p&gt;Previous message: %s&lt;\/p&gt;\r\n  &lt;p&gt;form\r\n  &lt;form method=\"post\" action=\"form.py\"&gt;\r\n    &lt;p&gt;message: &lt;input type=\"text\" name=\"message\"\/&gt;&lt;\/p&gt;\r\n  &lt;\/form&gt;\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;\r\n\"\"\" % cgi.escape(message)\r\n<\/pre>\n<p>O primeiro programa calcula os fatoriais dos n\u00fameros 2 at\u00e9 10, enquanto o segundo tem um formul\u00e1rio que submete um campo de texto para o pr\u00f3prio ficheiro.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Entretanto, depois de ler o manual com a sintaxe de base, pesquisei para ver como escrever programas em Python para a Web. E fiquei desiludido. O Python \u00e9 como o Perl e o Java, etc. O HTML \u00e9 gerado em c\u00f3digo, \u00e9 sempre processado. Isso fica mais pesado para o servidor. No site do Python, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"_links":{"self":[{"href":"http:\/\/www.inacreditavel.pt\/index.php?rest_route=\/wp\/v2\/posts\/22773"}],"collection":[{"href":"http:\/\/www.inacreditavel.pt\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.inacreditavel.pt\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.inacreditavel.pt\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.inacreditavel.pt\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=22773"}],"version-history":[{"count":10,"href":"http:\/\/www.inacreditavel.pt\/index.php?rest_route=\/wp\/v2\/posts\/22773\/revisions"}],"predecessor-version":[{"id":22783,"href":"http:\/\/www.inacreditavel.pt\/index.php?rest_route=\/wp\/v2\/posts\/22773\/revisions\/22783"}],"wp:attachment":[{"href":"http:\/\/www.inacreditavel.pt\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=22773"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.inacreditavel.pt\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=22773"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.inacreditavel.pt\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=22773"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}