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 é como o Perl e o Java, etc. O HTML é gerado em código, é sempre processado. Isso fica mais pesado para o servidor.
No site do Python, apresentam várias soluções para integrar o Python no Apache: CGI, mod_python, FastCGI, SCGI, mod_wsgi e WSGI. Este último parece ser a solução mais leve e funcional, mas com tanta literatura e referências a frameworks, decidi testar a versão mais simples: o CGI.
Ainda sobre o HowTo do Python acerca de Web Servers: o documento perde-se com considerações sobre persistência de dados, caching, programas que não correm como era esperado, falta de escalabilidade, frameworks para poder gerir projetos em MVC, etc. Coisas que o PHP já resolveu há mais de 15 anos. Aliás, nunca vi referências a esses problemas na documentação do PHP. Fiquei desiludido.
Mas quis testar o Python no Apache e configurei este último, numa máquina de testes, para correr o Python como CGI.
No ficheiro httpd.conf, descomentei a linha que inibe o uso do CGI
LoadModule cgi_module lib64/httpd/modules/mod_cgi.so
e acrescentei as linhas seguintes na configuração da diretoria do CGI
<Directory "/srv/httpd/cgi-bin"> Options +ExecCGI DirectoryIndex index.py </Directory> AddHandler cgi-script .py
Depois, criei os dois programas seguintes, na diretoria /srv/httpd/cgi-bin aos quais foi necessário dar permissões de execução:
chmod 755 /srv/httpd/cgi-bin/fatorial.py chmod 755 /srv/httpd/cgi-bin/form.py
/srv/httpd/cgi-bin/fatorial.py
#!/usr/bin/python import cgi import cgitb; cgitb.enable() # for troubleshooting print "Content-type: text/html" print print """ <html> <head><title>Fatorial em Python</title></head> <body> <h3> Fatorial em Python </h3> """ def mul(x,y): return x*y def fat(w): return reduce(mul, range(1,w+1)) def prt(x): print fat(x) map(prt, range(2,11)) print """ </body> </html> """
/srv/httpd/cgi-bin/form.py
#!/usr/bin/python import cgi import cgitb; cgitb.enable() # for troubleshooting print "Content-type: text/html" print print """ <html> <head><title>Sample CGI Script</title></head> <body> <h3> Sample CGI Script </h3> """ form = cgi.FieldStorage() message = form.getvalue("message", "(no message)") print """ <p>Previous message: %s</p> <p>form <form method="post" action="form.py"> <p>message: <input type="text" name="message"/></p> </form> </body> </html> """ % cgi.escape(message)
O primeiro programa calcula os fatoriais dos números 2 até 10, enquanto o segundo tem um formulário que submete um campo de texto para o próprio ficheiro.