4

我正在尝试使用 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!会按照我的预期显示。

到目前为止,我只发现了如何通过放置该行将 def (="application") 的默认名称更改为“something_else”

WSGICallableObject something_else

进入.htaccess.

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

任何帮助表示赞赏。

更新:

Graham 询问了我在 Apache 配置文件中使用的 mod_wsgi 配置以及我在哪里添加它。我添加了

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>

httpd.conf所有“LoadModule”行的末尾。

关于我的配置的一些附加信息:我正在使用 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。

希望对诊断有帮助...

4

5 回答 5

7

从http://code.google.com/p/modwsgi/wiki/InstallationOnWindows安装 mod_wsgi并正确配置您的 httpd.conf。

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

LoadModule 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)
于 2012-10-24T10:55:05.447 回答
1

1) 您需要使用 pip 或 easy_install 在托管环境中安装 webapp2、WebOb、粘贴必备模块

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

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

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

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

a2ensite website.conf

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

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

7) Apache web-server 将在重启 webapp2 时自动加载“website”配置。WSGIApplication 实例将指向 mod_wsgi“application”。

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

于 2014-05-06T11:58:20.153 回答
0

你有没有试过:

 WSGICallableObject app

您还可以将代码更改为:

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

并避免需要告诉 mod_wsgi 寻找不同的名称。

于 2012-07-13T14:11:14.893 回答
0

知道了!线

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

应该:

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

然后一切正常!啊!

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

为了让任何人都陷入与 webapp2 类似的路由问题,请查看http://webapp-improved.appspot.com/guide/routing.html。“简单路线”的第一个例子让我webapp.WSGIApplication在几分钟内重写了我的调用!

更新

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

从昨天开始没有改变任何一行代码。

在什么条件下我无法重现我得到 404 或正确的响应。我暂时放弃这个。这很可悲,因为我认为 Python 是一门很酷的语言。

@Graham:再次感谢您的帮助。

于 2012-07-18T11:41:41.537 回答
0

我自己还没有尝试过,但是您是否使用以下代码创建了另一个 Python 模块,比如 runme.py:

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

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

于 2012-07-13T16:06:23.817 回答