尝试在Apache / mod_wsgi上设置基于Bottle的Web应用程序时出错404

时间:2012-05-21 15:53:45

标签: python apache mod-wsgi bottle

我是初学程序员。我开始使用Python和Bottle为一个小型Web应用程序打印表单,到目前为止一切顺利。真正的问题是配置Apache和mod_wsgi,因为我的知识几乎没有。

我的问题:我一直收到此错误:

  

错误404:未找到

     

抱歉,请求的网址/ factura /导致错误:找不到

在工作中,他们给了我并重定向到IP:端口;经过几天阅读Apache文档并通过Web查看示例后,我设法设置了配置,因此我的VirtualHost不会破坏已经运行的其他虚拟主机。配置看起来像这样(基于瓶子教程部署部分):

Listen port
NameVirtualHost IP:port

<VirtualHost IP:port>
    ServerName IP:port

    WSGIDaemonProcess factura processes=1 threads=5
    WSGIScriptAlias / /var/www/factura/app.wsgi

    <Directory /var/www/factura>
        WSGIProcessGroup factura
        WSGIApplicationGroup %{GLOBAL}
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost>

我的app.wsgi几乎与Bottle教程部署部分中的sys.stdout = sys.stderr相同。我只添加了行import sys, os, bottle # Change working directory so relative paths (and template lookup) work again sys.path = ['/var/www/factura'] + sys.path os.chdir(os.path.dirname(__file__)) # Error output redirect # Exception KeyError in 'threading' module sys.stdout = sys.stderr import factura application = bottle.default_app()

from lib import bottle

app = bottle.Bottle()

#serves files in folder 'static'
@app.route('/static/:path#.+#', name='static')
def ...

@app.route("/factura")
@bottle.view("factura")
def ...

@app.route("/print_factura", method="POST")
def ...

这里有一些与Bottle有关的python代码:

app.wsgi

我已经阅读了与此类似的其他一些问题,但我无法看到我错过的内容。我想问题出在/var/www/factura/ ## .py files /views ## here is the web template /static ## .css and .js of template /lib ## package with bottle and peewee source files /data ## inkscape file to play with /bin ## backup stuff in repo, not used in code

更新

文件结构

Exception KeyError: KeyError(-1211426160,) in <module 'threading' from '/usr/lib/python2.6/threading.pyc'> ignored

Apache错误日志仅显示

@app.route("/factura/") 这是来自wsgi / python问题的警告,wsgi issue 197

无害

更新2 正在运作
添加from factura import app as application注意跟踪斜线,随着应用导入{{1}}的变化,这两者一起使其工作

1 个答案:

答案 0 :(得分:3)

如果您明确创建应用程序:

app = bottle.Bottle()

然后您应该在app.wsgi而不是application = bottle.default_app()中导入它:

from factura import app as application

但重要的是这一点。在您的WSGI文件中,您执行import bottle,但在应用程序代码文件中,您执行from lib import bottle。正如您所解释的那样,您有两个Bottle副本:一个安装在服务器范围内,另一个安装在lib目录下。

这就是你收到404 Not Found的原因。您实际上正在使用库的一个实例(创建app),然后从不同的库实例中为Apache提供不同的(default_app

当你开始返回正确的app时,它开始正常工作。