Apache下的webapp2(=没有Google App Engine)

我正在尝试在Apache和mod_wsgi的Python下运行webapp2 – 具体来说:Wampserver for Windows 7 with Apache 2.2.22。 到目前为止,我失败了。 🙁

我使用了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) 

当我把这个文件保存为c:wamp\www\Python\hello.py ,然后浏览到localhost/Python/hello.py我得到:

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

不过,让我声明在Apache中的Python的mod_wsgi似乎运行良好; 下面的代码

 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] 

位于c:\wamp\www\Python\test.py 当我到localhost/Python/test.py ,浏览器说Hello from Python! 如我所料。

到目前为止,我只find了如何通过将行(默认名称为“应用程序”)更改为“something_else”

 WSGICallableObject something_else 

进入.htaccess

但我怎样才能让Apache接受variablesapp作为一个可调用的对象? (到目前为止,我主要使用Python来编写Web以外的程序,所以我希望这不是一个愚蠢的问题。)

任何帮助表示赞赏。

更新:

格雷厄姆问我关于我在Apacheconfiguration文件中使用的mod_wsgiconfiguration,以及我在哪里添加它。 我补充说

 LoadModule wsgi_module modules/mod_wsgi.so <Directory "c:/wamp/www/python"> Options +ExecCGI AddHandler wsgi-script .py Order allow,deny Allow from all </Directory> 

到所有“LoadModule”行结尾的httpd.conf

关于我的configuration的一些额外的信息:我正在使用mod_wsgi-win32-ap22py27-3.3.so。 (当然,我把它重命名为mod_wsgi.so并将它放在c:\wamp\bin\apache\apache2.2.22\modules 。)我的Python命令行提到了这个版本: Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win 32 。 我使用的wamp服务器是32位。 我的操作系统是Windows 7 Ultimate 64bit SP1。

希望这有助于诊断…

http://code.google.com/p/modwsgi/wiki/InstallationOnWindows安装mod_wsgi并正确配置你的httpd.conf&#x3002;

我假设你已经添加了这两行:

 Loadmodulee wsgi_module modules/mod_wsgi.so WSGICallableObject app 

http://pypi.python.org/pypi/setuptools安装py-setuptools然后为你的python安装模&#x5757;

 easy_install WebOb easy_install Paste easy_install webapp2 

创建虚拟主机

 <VirtualHost *> serverAdmin admin@mydomain.com DocumentRoot "/vhost/domains/mydomain/htdocs" serverName a.mydomain.net WSGIScriptAlias / "/vhost/domains/mydomain/wsgi/main.py" Alias /static/ "/vhost/domains/mydomain/htdocs/static/" </VirtualHost> 

文件: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)您需要使用pip或easy_install在主机环境中安装webapp2,WebOb,Paste prerequisites模块

2)在网站的根目录下创建wsgi.py文件(/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)在sites-available文件夹(/etc/apache2/sites-available/website.conf)下创建apache2配置文件

 <VirtualHost *:80> serverName website WSGIScriptAlias / "/var/www/ website /wsgi.py" </VirtualHost> 

4)将“网站”别名添加到“/ etc / hosts”文件中。

5)运行以下命令启用“/etc/apache2/sites-available/website.conf”

 a2ensite website.conf 

6)重新加载并重新启动apache2 web服务器

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

7)Apache Web服务器将自动加载“网站”配置重新启动webapp2.WSGIApplication实例将指向mod_wsgi“应用程序”。

请注意上面的例子是在Ubuntu 13.10操作系统上测试的。

你有没有尝试过:

  WSGICallableObject app 

你也可以改变你的代码来说:

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

并避免需要告诉mod_wsgi去寻找一个不同的名字。

我还没有尝试过,但是你是否创建了另一个Python模块,比如runme.py,下面的代码:

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

(注意:我从https://developers.google.com/appengine/docs/python/python27/migrate27#wsgi

得到它了! 该线

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

应该:

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

然后一切正常! Arghh!

非常感谢Graham耐心地把我推向正确的方向:问题确实在webapp2的范围内,只要WSGICallableObject被设置为“app”!

对于任何人在webapp2上遇到类似的路由问题的好处:检查http://webapp-improved.appspot.com/guide/routing.html 。 “简单路由”的第一个例子让我在几分钟之内重写了对webapp.WSGIApplication调用!

更新

不幸的是,上面的解决方案似乎并不可靠:今天,我有时从webapp2得到了正确的回应,有时我从webapp2得到了404。

自从昨天以来,没有改变一行代码。

我不能在什么条件下获得404或正确的答复。 我现在放弃这个。 这很令人伤心,因为我认为Python是一种非常酷的语言。

@格拉汉姆:再次感谢您的帮助。