基于Web.Py的应用程序,启动没有问题,导航到URL“/”时抛出KeyError

时间:2012-11-04 18:17:08

标签: python web.py

我正试图让我的一个麻烦的python应用程序工作。我刚刚通过@unutbu here的帮助克服了一个问题。

我的下一个问题有点奇怪,堆栈跟踪显示与我的代码无关:

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/web.py-0.37-py2.7.egg/web/application.py", line 239, in process
    return self.handle()
  File "/usr/local/lib/python2.7/dist-packages/web.py-0.37-py2.7.egg/web/application.py", line 230, in handle
    return self._delegate(fn, self.fvars, args)
  File "/usr/local/lib/python2.7/dist-packages/web.py-0.37-py2.7.egg/web/application.py", line 419, in _delegate
    cls = fvars[f]
KeyError: u'Home'

我称之为web.py函数的唯一脚本是:

#Application/App.py
import web
class AppInstance(object):
    def __init__(self):
        from Views import Home
        self.urls = (
                "/", "Home",
                )
        self.app = web.application(self.urls, globals())
    def run(self):
        self.app.run()

这个人从脚本中调用文件系统中的上层目录:

#start.py
from Application import App
app = App.AppInstance()
app.run()

如果你愿意,我可以复制目录布局从我上面提到的问题看起来如何,但我现在不这样做,因为它会导致很多混乱(树命令的输出)。我的问题是:如何通过对目录结构进行最小的更改来解决此问题?

<小时/> 我想添加应用程序的目录结构应该对那些想要帮助/可能会为了解决自己的问题而阅读此内容的人有所帮助。

Blog/
├── Application/
│   ├── App.py
│   └── __init__.py
|
├── Engine/
│   ├── Connection/
│   │   ├── __init__.py
│   │   └── MySQLConnection.py
│   ├── Errors.py
│   └── __init__.py
├── __init__.py
├── Models/
│   ├── BlogPostModel.py
│   └── __init__.py
├── start.py
└── Views/
    ├── Home.py
    └── __init__.py

这件事刚刚开始,旨在提供一个博客引擎,并帮助我实现我迄今为止所学到的完整而有用的东西。

1 个答案:

答案 0 :(得分:2)

web.application的第二个参数必须是潜在处理程序的字典。在您的情况下,您希望Home在其中,但该绑定仅在局部变量中。请致电locals而不是globals

import web
class AppInstance(object):
    def __init__(self):
        from Views import Home
        self.urls = (
                "/", "Home",
                )
        self.app = web.application(self.urls, locals())
        #                                     ^^^^^^
    def run(self):
        self.app.run()

或移动导入:

import web
from Views import Home # <-- Moved into global namespace
class AppInstance(object):
    def __init__(self):
        self.urls = (
                "/", "Home",
                )
        self.app = web.application(self.urls, globals())
    def run(self):
        self.app.run()