{"id":163,"date":"2014-03-06T14:34:36","date_gmt":"2014-03-06T14:48:04","guid":{"rendered":"https:\/\/8260c2014-03-06_14-47-36.png"},"modified":"2015-07-16T20:56:13","modified_gmt":"2015-07-17T02:56:13","slug":"corriendo-python-bajo-apache","status":"publish","type":"post","link":"https:\/\/emanuelpaxtian.com\/blog\/corriendo-python-bajo-apache\/","title":{"rendered":"Corriendo python bajo apache"},"content":{"rendered":"<p>Vamos a aprender c\u00f3mo servir aplicaciones Web con Python, utilizando el servidor Apache, No es mucha la bibliograf\u00eda que puede encontrarse al respecto, pero s\u00ed, lo es bastante confusa y hasta incluso contradictoria.<\/p>\n<p>\u00bfQu\u00e9 necesitamos?<br \/>\nEn principio, necesitamos hacer que Apache, incorpore un soporte para servir archivos Python. Para ello, necesitaremos habilitarle un m\u00f3dulo, que brinde este soporte.<\/p>\n<p>Existen varios m\u00f3dulos de Apache que brindan soporte para correr archivos Python. Uno de los m\u00e1s populares es el m\u00f3dulo mod_python, que sin embargo, presenta algunos problemas que pueden prevenirse, utilizando el m\u00f3dulo mod_wsgi el cual utilizaremos en este curso.<\/p>\n<p>1) Instalaci\u00f3n de mod_wsgi en Apache<\/p>\n<p>Para habilitar mod_wsgi en Apache, basta con instalar el paquete libapache2-mod-wsgi:<\/p>\n<blockquote><p>sudo apt-get install libapache2-mod-wsgi<\/p><\/blockquote>\n<p>2) Crear la estructura de directorios para nuestra aplicaci\u00f3n<\/p>\n<p>Primero, es importante saber, como va a funcionar nuestra aplicaci\u00f3n y c\u00f3mo va a interactuar v\u00eda Web.<\/p>\n<p>Debemos tener un directorio destinado a montar toda la aplicaci\u00f3n:<\/p>\n<blockquote><p>mkdir \/home\/yo\/curso-python\/trunk\/python-web<\/p><\/blockquote>\n<p>Dentro de este directorio, vamos a dividir su arquitectura en dos partes:<\/p>\n<p>Destinada al almacenaje de nuestra aplicaci\u00f3n Python pura (ser\u00e1 un directorio privado, no servido).<br \/>\nDestinada a servir la aplicaci\u00f3n (directorio p\u00fablico servido) en el cu\u00e1l solo almacenaremos archivos est\u00e1ticos.<\/p>\n<blockquote><p>mkdir \/home\/yo\/curso-python\/trunk\/python-web\/mypythonapp<br \/>\nmkdir \/home\/yo\/curso-python\/trunk\/python-web\/public_html<\/p><\/blockquote>\n<p>Dentro de nuestro directorio mypythonapp, almacenaremos entonces, todos los m\u00f3dulos y paquetes de nuestra aplicaci\u00f3n Python, mientras que en public_html, estar\u00e1n todos los archivos est\u00e1ticos y ser\u00e1 el \u00fanico directorio al que se pueda acceder mediante el navegador Web.<\/p>\n<p>Aprovecharemos este paso, para crear una carpeta, destinada a almacenar los logs de errores y accesos a nuestra Web App:<\/p>\n<blockquote><p>mkdir \/home\/yo\/curso-python\/trunk\/python-web\/logs<\/p><\/blockquote>\n<p>3) Crear un controlador para la aplicaci\u00f3n<\/p>\n<p>Todas las peticiones realizadas por el usuario (es decir, las URI a las cu\u00e1les el usuario acceda por el navegador), ser\u00e1n manejadas por un \u00fanico archivo, que estar\u00e1 almacenado en nuestro directorio mypythonapp.<\/p>\n<blockquote><p>echo &#8216;# -*- coding: utf-8 -*-&#8216; &gt; mypythonapp\/controller.py<\/p><\/blockquote>\n<p>Este archivo controller.py actuar\u00e1 como un pseudo front controller, siendo el encargado de manejar todas las peticiones del usuario, haciendo la llamada a los m\u00f3dulos correspondientes seg\u00fan la URI solicitada.<\/p>\n<p>Dicho m\u00f3dulo, solo se encargar\u00e1 de definir una funci\u00f3n, que act\u00fae con cada petici\u00f3n del usuario. Esta funci\u00f3n, deber\u00e1 ser una funci\u00f3n WSGI aplicaci\u00f3n v\u00e1lida. Esto significa que:<\/p>\n<p>Deber\u00e1 llamarse application<br \/>\nDeber\u00e1 recibir dos par\u00e1metros: environ, del m\u00f3dulo os, que provee un diccionario de las peticiones HTTP est\u00e1ndar y otras variables de entorno, y la funci\u00f3n start_response, de WSGI, encargada de entregar la respuesta HTTP al usuario.<\/p>\n<pre class=\"brush: php\">def application(environ, start_response): \r\n# Genero la salida HTML a mostrar al usuario output = \"&lt;p&gt;Bienvenido a mi &lt;b&gt;PythonApp&lt;\/b&gt;!!!&lt;\/p&gt;\" \r\n# Inicio una respuesta al navegador \r\nstart_response('200 OK', [('Content-Type', 'text\/html; charset=utf-8')]) \r\n# Retorno el contenido HTML \r\nreturn output&lt;\r\n<\/pre>\n<p>M\u00e1s adelante, veremos como crear un Application WSGI Controller, mucho m\u00e1s potente.<\/p>\n<p>4) Configurar el VirtualHost<\/p>\n<p>En la buena configuraci\u00f3n de nuestro VirtualHost, estar\u00e1 la clave para correr nuestra aplicaci\u00f3n Python a trav\u00e9s de la Web.<\/p>\n<p>Mientras que el DocumentRoot de nuestro sitio Web, ser\u00e1 la carpeta p\u00fablica, public_html, una variable del VirtualHost, ser\u00e1 la encargada de redirigir todas las peticiones p\u00fablicas del usuario, hacia nuestro front controller. Y la variable que se encargue de esto, ser\u00e1 el alias WSGIScriptAlias:<\/p>\n<blockquote><p>sudo nano \/etc\/apache2\/sites-available\/python-web<\/p><\/blockquote>\n<p>Una vez all\u00ed, escribimos el contenido del nuevo virtual host:<\/p>\n<blockquote><p>&lt;VirtualHost *:80&gt;<br \/>\nServerName python-web<\/p>\n<p>DocumentRoot \/home\/yo\/curso-python\/trunk\/python-web\/public_html<br \/>\nWSGIScriptAlias \/ \/home\/yo\/curso-python\/trunk\/python-web\/mypythonapp\/controller.py<br \/>\nErrorLog \/home\/yo\/curso-python\/trunk\/python-web\/logs\/errors.log<br \/>\nCustomLog \/home\/yo\/curso-python\/trunk\/python-web\/logs\/access.log combined<\/p>\n<p>&lt;Directory \/&gt;<br \/>\nOptions FollowSymLinks<br \/>\nAllowOverride All<br \/>\n&lt;\/Directory&gt;<br \/>\n&lt;\/VirtualHost&gt;<\/p><\/blockquote>\n<p>Una vez configurado nuestro VirtualHost:<\/p>\n<p>Habilitamos el sitio web: sudo a2ensite python-web<br \/>\nRecargamos Apache: sudo service apache2 reload<br \/>\nHabilitamos el sitio en nuestro host: sudo nano \/etc\/hosts y all\u00ed agregamos la siguiente l\u00ednea:<\/p>\n<blockquote><p>127.0.0.1python-web<\/p><\/blockquote>\n<p>A partir de ahora, si abrimos nuestro navegador Web e ingresamos la url http:\/\/python-web veremos la frase: &#8220;Bienvenido a mi PythonApp&#8221;.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vamos a aprender c\u00f3mo servir aplicaciones Web con Python, utilizando el servidor Apache, No es mucha la bibliograf\u00eda que puede encontrarse al respecto, pero s\u00ed, lo es bastante confusa y&hellip;<\/p>\n","protected":false},"author":1,"featured_media":532,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[],"class_list":["post-163","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-python"],"_links":{"self":[{"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/posts\/163","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/comments?post=163"}],"version-history":[{"count":0,"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/posts\/163\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/media\/532"}],"wp:attachment":[{"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/media?parent=163"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/categories?post=163"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/tags?post=163"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}