我正在尝试在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。
我假设你已经添加了这两行:
Loadmodulee wsgi_module modules/mod_wsgi.so WSGICallableObject app
从http://pypi.python.org/pypi/setuptools安装py-setuptools然后为你的python安装模块
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“应用程序”。
你有没有尝试过:
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是一种非常酷的语言。
@格拉汉姆:再次感谢您的帮助。