4

我是初学者程序员。我开始使用 Python 和 Bottle 来制作一个小型 Web 应用程序来打印表单,到目前为止一切都很好。真正的问题是配置 Apache 和mod_wsgi,据我所知几乎没有。

我的问题:我不断收到此错误:

未找到错误404

抱歉,请求的 URL /factura/ 导致错误:未找到

在工作中,他们给了我重定向到 IP:port 的地址;经过几天阅读 Apache 文档并通过网络查看示例后,我设法设置了配置,因此我的 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()

下面是一些与 Bottle 相关的 python 代码:

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 ...

我已经阅读了与此类似的其他一些问题,但我无法看到我错过了什么。我想问题出在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

Apache 错误日志只显示

Exception KeyError: KeyError(-1211426160,) in <module 'threading' from '/usr/lib/python2.6/threading.pyc'> ignored 这是来自 wsgi/python 问题的警告,wsgi 问题 197无害

更新 2工作
添加@app.route("/factura/")注意斜线,随着应用程序导入的更改,from factura import app as application这两者一起使其工作

4

1 回答 1

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

于 2012-05-21T16:26:40.263 回答