webapp2 sous Apache (= sans Google App Engine)

J’essaie de lancer webapp2 sous Python avec Apache et mod_wsgi – en particulier: Wampserver pour Windows 7 avec Apache 2.2.22. Jusqu’à présent, j’ai échoué lamentablement. 🙁

J’ai utilisé l’exemple suivant à l’ adresse https://developers.google.com/appengine/docs/python/gettingstartedpython27/usingwebapp :

import webapp2 class MainPage(webapp2.RequestHandler): def get(self): self.response.headers['Content-Type'] = 'text/plain' self.response.out.write('Hello, webapp World!') app = webapp2.WSGIApplication([('/', MainPage)], debug=True) 

Lorsque je sauvegarde ce fichier sous le nom c:wamp\www\Python\hello.py , et c:wamp\www\Python\hello.py jusqu’à localhost/Python/hello.py j’obtiens:

 Not Found The requested URL /python/hello.py was not found on this server. 

Cependant, permettez-moi de dire que mod_wsgi pour Python dans Apache semble fonctionner correctement; le code suivant

 def application(environ, start_response): status = '200 OK' output = 'Hello from Python!' response_headers = [('Content-type', 'text/plain'), ('Content-Length', str(len(output)))] start_response(status, response_headers) return [output] 

se trouve dans c:\wamp\www\Python\test.py Quand je vais à localhost/Python/test.py , le navigateur dit Hello from Python! comme je m’attendais à

Jusqu’à présent, j’ai seulement trouvé comment changer le nom par défaut de def (= “application”) en “something_else” en mettant la ligne

 WSGICallableObject something_else 

dans .htaccess .

Mais comment puis-je obtenir Apache pour accepter l’ app variable en tant qu’object appelable? (Jusqu’à présent, j’ai utilisé Python principalement pour la programmation en dehors du Web, alors j’espère que ce n’est pas une question stupide.)

Toute aide est appréciée.

Mettre à jour:

Graham m’a interrogé sur la configuration de mod_wsgi que j’utilise dans les fichiers de configuration d’Apache et où je l’ajoute. J’ai ajouté

 LoadModule wsgi_module modules/mod_wsgi.so  Options +ExecCGI AddHandler wsgi-script .py Order allow,deny Allow from all  

à httpd.conf à la fin de toutes les lignes “LoadModule”.

Quelques informations supplémentaires sur ma configuration: J’utilise mod_wsgi-win32-ap22py27-3.3.so. (Bien sûr, je l’ai renommé mod_wsgi.so et l’ mod_wsgi.so placé dans c:\wamp\bin\apache\apache2.2.22\modules .) Ma ligne de commande Python l’indique à propos de la version: Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win 32 . Le serveur wamp que j’utilise est 32 bits. Mon système d’exploitation est Windows 7 Ultimate 64bit SP1.

J’espère que cela aide avec le diagnostic …

Installez mod_wsgi à partir de http://code.google.com/p/modwsgi/wiki/InstallationOnWindows et configurez correctement votre httpd.conf.

Je suppose que vous avez déjà ajouté ces 2 lignes:

 LoadModule wsgi_module modules/mod_wsgi.so WSGICallableObject app 

Installez py-setuptools à partir de http://pypi.python.org/pypi/setuptools, puis installez Modules pour votre python.

 easy_install WebOb easy_install Paste easy_install webapp2 

Créer virtualhost

  ServerAdmin [email protected] DocumentRoot "/vhost/domains/mydomain/htdocs" ServerName a.mydomain.net WSGIScriptAlias / "/vhost/domains/mydomain/wsgi/main.py" Alias /static/ "/vhost/domains/mydomain/htdocs/static/"  

Fichier: main.py

 import webapp2 class Hello(webapp2.RequestHandler): def get(self): self.response.headers['Content-Type'] = 'text/html; charset=utf-8' self.response.out.write('hello world!') application = webapp2.WSGIApplication([ ('/', Hello) ], debug=True) 

1) Vous devez installer les modules webapp2, WebOb, Paste conditions préalables sur l’environnement d’hébergement à l’aide de pip ou easy_install

2) Créez le fichier wsgi.py sous le dossier racine du site Web (/var/www/website/wsgi.py).

 #/var/www/website/wsgi.py import webapp2 class Index(webapp2.RequestHandler): def get(self): output = 'webapp2 running on apache2' self.response.headers = [('Content-type','text/plain'),('Content-length',str(len(output)))] self.response.out.write(output) application = webapp2.WSGIApplication([('/',Index)], debug=True) 

3) Créez le fichier de configuration apache2 sous le dossier sites-available (/etc/apache2/sites-available/website.conf)

  ServerName website WSGIScriptAlias / "/var/www/ website /wsgi.py"  

4) Ajouter un alias “website” au fichier “/ etc / hosts”.

5) Exécutez la commande suivante pour activer “/etc/apache2/sites-available/website.conf”

 a2ensite website.conf 

6) Recharger et redémarrer le serveur Web apache2

 service apache2 reload /etc/init.d/apache2 restart 

7) Le serveur Web Apache chargera automatiquement la configuration du “site Web” au redémarrage de l’instance webapp2.WSGIApplication indiquera “application” mod_wsgi.

Veuillez noter que l’exemple ci-dessus est testé sur un système d’exploitation Ubuntu 13.10.

Avez-vous pas essayé:

  WSGICallableObject app 

Vous pouvez également changer votre code pour dire:

 application = webapp2.WSGIApplication([('/', MainPage)], debug=True) 

et éviter de devoir dire à mod_wsgi de chercher un autre nom.

Je ne l’ai pas encore essayé, mais avez-vous créé un autre module Python, par exemple runme.py, avec le code suivant:

 def main(): run_wsgi_app(yourmodule.app) if __name__ == '__main__': main() 

(Remarque: je l’ai eu depuis https://developers.google.com/appengine/docs/python/python27/migrate27#wsgi

Je l’ai! La ligne

app = webapp2.WSGIApplication([('/', MainPage)], debug=True)

devrait être:

app = webapp2.WSGIApplication([('/Python/hello.py', MainPage)], debug=True)

et alors tout fonctionne! Arghh!

Un grand merci à Graham pour m’avoir poussé avec patience dans la bonne direction: le problème était en effet dans les limites de webapp2, dès que WSGICallableObject était réglé sur “app”!

Pour que quiconque soit bloqué par un problème de routage similaire avec webapp2: Consultez http://webapp-improved.appspot.com/guide/routing.html . Le premier exemple sur les “routes simples” m’a webapp.WSGIApplication à réécrire mon appel à webapp.WSGIApplication quelques minutes!

Mettre à jour

Malheureusement, la solution ci-dessus ne semble pas fiable: aujourd’hui, je reçois parfois une réponse correcte de webapp2, et parfois je reçois un 404 de webapp2.

Sans changer une seule ligne de code depuis hier.

Je ne peux pas reproduire dans quelles conditions je reçois le 404 ou la bonne réponse. Je renonce à cela pour le moment. Ce qui est sortingste, car je pense que Python est un langage tellement cool.

@ Graham: Encore une fois, merci pour votre aide.