2009-07-03 11 views
6

He creado una aplicación web.py, y ahora que está lista para su implementación, deseo ejecutarla no en el servidor web incorporado de web.py. Quiero poder ejecutarlo en diferentes servidores web, Apache o IIS, sin tener que cambiar el código de mi aplicación. Aquí es donde se supone que WSGI debe entrar, si lo entiendo correctamente.
Sin embargo, no entiendo qué tengo que hacer para que mi aplicación pueda implementarse en un servidor WSGI. La mayoría de los ejemplos asumen que estás usando Pylons/Django/other-framework, en el que simplemente ejecutas un comando mágico que arregla todo para ti.
Por lo que entiendo de la (bastante breve) documentación de web.py, en lugar de ejecutar web.application(...).run(), debería usar web.application(...).wsgifunc(). ¿Y entonces que?Implementación de una aplicación Web.py con WSGI, varios servidores

Respuesta

6

Exactamente lo que necesita hacer para alojarlo con un mecanismo de alojamiento de WSGI específico varía con el servidor.

Para el caso de Apache/mod_wsgi y Phusion Passenger, solo necesita proporcionar un archivo de script WSGI que contenga un objeto llamado 'aplicación'. Para web.py 0.2, este es el resultado de llamar a web.wsgifunc() con argumentos apropiados. Para web.py 0.3, en su lugar utiliza la función de miembro wsgifunc() del objeto devuelto por web.application(). Para detalles de estos ver la documentación mod_wsgi:

http://code.google.com/p/modwsgi/wiki/IntegrationWithWebPy

Si por el contrario va a ser sometido a usar FastCGI, SCGI o AJP adaptadores para un servidor como Lighttpd, nginx o Cherokee, entonces es necesario utilizar el paquete 'flup' para proporcionar un puente entre esas interfaces independientes del lenguaje y WSGI. Esto implica invocar una función de volteo con el mismo objeto de aplicación WSGI arriba que algo como mod_wsgi o Phusion Passenger usarían directamente sin la necesidad de un puente. Para más detalles de esta Sede:

http://trac.saddi.com/flup/wiki/FlupServers

Lo importante es estructurar su aplicación web para que sea en su propio auto contenida conjunto de módulos. Para trabajar con un servidor en particular, cree un archivo de script separado según sea necesario para establecer un puente entre lo que ese servidor requiere y su código de aplicación. El código de su aplicación siempre debe estar fuera del directorio del documento del servidor web y solo el archivo de script que actúa como puente estaría en el directorio del documento del servidor, si corresponde.

+0

Ok, así que no hay manera general, para hacerlo. Lástima. Entonces tendré que escribir un montón de adaptadores. ¡Gracias de todos modos! – carlpett

0

Hasta el 21 de julio de 2009, hay una guía de instalación mucho más completa en the webpy install site, que discute flup, fastcgi, Apache y más. Todavía no he intentado, pero parece que es mucho más detallado.

0

Aquí es un ejemplo de dos aplicaciones de servidor con el servidor wsgi cherrypy:

 

#!/usr/bin/python 
from web import wsgiserver 
import web 

# webpy wsgi app 
urls = (
    '/test.*', 'index' 
) 

class index: 
    def GET(self): 
     web.header("content-type", "text/html") 
     return "Hello, world1!" 

application = web.application(urls, globals(), autoreload=False).wsgifunc() 


# generic wsgi app 
def my_blog_app(environ, start_response): 
    status = '200 OK' 
    response_headers = [('Content-type','text/plain')] 
    start_response(status, response_headers) 
    return ['Hello world! - blog\n'] 


""" 
# single hosted app 
server = wsgiserver.CherryPyWSGIServer(
      ('0.0.0.0', 8070), application, 
      server_name='www.cherrypy.example') 

""" 

# multiple hosted apps with WSGIPathInfoDispatcher 
d = wsgiserver.WSGIPathInfoDispatcher({'/test': application, '/blog': my_blog_app}) 
server = wsgiserver.CherryPyWSGIServer(('0.0.0.0', 8070), d)    
server.start() 
Cuestiones relacionadas