Ich habe eine web.py-Anwendung erstellt, und jetzt, da sie für die Bereitstellung bereit ist, möchte ich nicht auf dem integrierten web.py-Webserver ausgeführt werden. Ich möchte es auf verschiedenen Webservern, Apache oder IIS ausführen können, ohne meinen Anwendungscode ändern zu müssen. Hier sollte WSGI hereinkommen, wenn ich es richtig verstehe.
Allerdings verstehe ich nicht, was genau ich tun muss, um meine Anwendung auf einem WSGI-Server deploybar zu machen? Die meisten Beispiele nehmen an, dass Sie Pylons/Django/other-framework verwenden, auf dem Sie einfach einen magischen Befehl ausführen, der alles für Sie repariert.
Von dem, was ich von der (ziemlich kurzen) web.py Dokumentation verstehe, anstelle von web.application(...).run()
, sollte ich web.application(...).wsgifunc()
verwenden. Und dann was?Bereitstellen einer Web.py-Anwendung mit WSGI, mehrere Server
Antwort
Genau das, was Sie tun müssen, um es mit einem bestimmten WSGI-Hosting-Mechanismus zu hosten, hängt vom Server ab.
Für Apache/mod_wsgi und Phusion Passenger müssen Sie nur eine WSGI-Skriptdatei bereitstellen, die ein Objekt namens "application" enthält. Für web.py 0.2 ist dies das Ergebnis des Aufrufs von web.wsgifunc() mit entsprechenden Argumenten. Für web.py 0.3 verwenden Sie stattdessen die wsgifunc() -Memberfunktion des von web.application() zurückgegebenen Objekts. Einzelheiten zu diesen mod_wsgi Dokumentation:
http://code.google.com/p/modwsgi/wiki/IntegrationWithWebPy
Wenn Sie stattdessen FastCGI, SCGI oder AJP Adapter für einen Server wie Lighttpd, nginx oder Cherokee verwenden haben, dann müssen Sie ‚flup‘ Paket verwenden eine Brücke zwischen diesen sprachunabhängigen Schnittstellen und WSGI zu schlagen. Dies beinhaltet das Aufrufen einer Flup-Funktion mit demselben WSGI-Anwendungsobjekt über etwas, das mod_wsgi oder Phusion Passenger direkt verwenden würde, ohne dass eine Brücke benötigt wird. Einzelheiten zu diesem siehe:
http://trac.saddi.com/flup/wiki/FlupServers
Wichtig ist, Ihre Web-Anwendung so zu strukturieren, dass sie in ihrem eigenen selbst enthalten ist die Module festgelegt. Um mit einem bestimmten Server zu arbeiten, erstellen Sie nach Bedarf eine separate Skriptdatei, um zwischen dem, was dieser Server benötigt, und Ihrem Anwendungscode zu überbrücken. Ihr Anwendungscode sollte sich immer außerhalb des Dokumentordners des Webservers befinden und nur die Skriptdatei, die als Bridge fungiert, befindet sich gegebenenfalls im Verzeichnis des Serverdokuments.
Ab 21. 2009, im Juli gibt es eine viel vollere Installationsanleitung bei the webpy install site, die flup, fastcgi, Apache und mehr diskutiert. Ich habe es noch nicht versucht es, aber es scheint, als wäre es viel detaillierter. Hier
ist ein Beispiel für zwei gehostete Anwendungen mit cherrypy wsgi Server:
#!/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()
Ok, so gibt es keine allgemeine Art und Weise, es zu tun. Das Mitleid. Ich muss dann nur ein paar Adapter aufschreiben. Danke trotzdem! – carlpett