【问题标题】:webapp2 under Apache (= without Google App Engine)Apache 下的 webapp2(= 没有 Google App Engine)
【发布时间】:2012-07-13 08:35:07
【问题描述】:

我正在尝试使用 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。

希望这有助于诊断...

【问题讨论】:

    标签: python apache mod-wsgi webapp2


    【解决方案1】:

    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)
    

    【讨论】:

      【解决方案2】:

      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文件夹(/etc/apache2/sites-available/website.conf)下创建apache2配置文件

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

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

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

      a2ensite website.conf
      

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

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

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

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

      【讨论】:

        【解决方案3】:

        你没试过吗:

         WSGICallableObject app
        

        您也可以将代码更改为:

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

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

        【讨论】:

        • 是的,我在提问之前尝试过WSGICallableObject app。这给了我404 Not Found The resource could not be found. 你的建议application = webapp2... 是我没有想到的。不幸的是,它也给了我一个 404。
        • 然后在原始问题中添加更多详细信息,显示您在 Apache 配置文件中使用的 mod_wsgi 配置以及添加位置。
        • 我现在已经在问题中添加了这些细节。这是足够的信息还是您需要更多信息?提前致谢。
        • 您的 Apache 配置中的 DocumentRoot 设置是什么?
        • DocumentRoot "c:/wamp/www/"
        【解决方案4】:

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

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

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

        【讨论】:

        • 感谢您的提示。我查看了您所指的页面。不幸的是,我没有yourmodule.app,因为我的工作没有 Google App Engine。此外,如果我使用的是 GAE,这甚至都不是正确的解决方案,因为这是在您迁移到 GAE 时应该注释掉的一段代码蟒蛇 2.7。因此,如果我尝试连接到 GAE,这甚至是错误的。
        【解决方案5】:

        知道了!线

        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:再次感谢您的帮助。

        【讨论】:

        • 如果可行,它基本上说明 webapp2 不是一个表现良好的 WSGI 应用程序,因为它忽略了挂载点。它应该只解析相对于在 SCRIPT_NAME 中传递的挂载点的 URL。 IOW,他们应该映射 PATH_INFO。
        • @Graham:webapp2 显然表现不佳:我删除了自己的“接受答案”检查。 (见上面的更新。)我现在放弃了。我不能再玩弄这个了,因为我正在为一个重要的项目评估 Python/webapp2。就我的口味而言,这显然还不够可靠。这是一个真正的遗憾,因为 Python 是一种很酷的语言。但是谢谢你帮助我。
        • 我个人建议你使用 Flask。它是一个非常优秀的 WSGI 框架,体积小且易于使用。 webapp2 框架在 Python 网络社区中的地位并不高,知名度也不高。
        猜你喜欢
        • 2011-10-10
        • 1970-01-01
        • 1970-01-01
        • 2017-10-04
        • 1970-01-01
        • 2011-12-07
        • 2013-09-09
        • 2017-10-24
        • 1970-01-01
        相关资源
        最近更新 更多