另一个 web.py 名称冲突

Yet another web.py name collision

我正在尝试在 Python 3.7.4 和 web.py 0.40-dev1(应该是兼容的)中制作一个简单的 Hello World 网页,我 运行变成

AttributeError: module 'web' has no attribute 'applications'

错误。我已经用 google 搜索了足够多的信息,知道这是一个名称冲突,但看在上帝的份上,我无法追踪到它。

完整代码如下:

import web

urls = (
    '/', 'index'
)

application = web.applications(urls, globals())

class index:
    def GET(self):
        greeting = 'Hello world'
        return greeting

if __name__ == "__main__":
    application.run

下面是完整的 Python 解释器输出:

Traceback (most recent call last):
  File "bin\app.py", line 7, in <module>
    application = web.applications(urls, globals())
AttributeError: module 'web' has no attribute 'applications'

刚刚快速浏览了文档。看起来您要查找的命令是 web.application 而不是 web.applications。请注意应用程序上没有 s。

因为你,我才安装 web.py 来测试你的代码。 web.py里好像没有applications。如果您想检查它,请尝试以下示例。

>>> import web
>>> 
>>> `applications` in dir(web)
False
>>> `application` in dir(web)
True

所以应该是 web.application。你的第一个问题解决了,当你 运行 它时你会得到另一个错误 RuntimeError: generator raised StopIteration。该问题已在 问题中解决。它的发生是因为 python 3.7.* 版本。 0.40-dev1 版本有问题。你有两个选择。

  1. 删除 0.40-dev1 版本并从那里的 master 分支安装稳定版本。只需使用此命令 pip uninstall web.py==0.40-dev1 和 运行 此命令 pip install -e git+https://github.com/webpy/webpy.git#egg=webpy 即可卸载。这将从 master 分支安装最新版本。 (这对我有用)
  2. 下一个是以这种方式更新 utils.py。从 Python\Python37\Lib\site-packages\web\utils.py 中找到它(我从 windows 中尝试)并找到 line 526。然后你会看到类似这样的东西yield next(seq) 并以这种方式用 try-catch 语句包围它。 (不推荐,而不是通过相关分支创建自己的版本)
def take(seq, n):
    for i in range(n):
        # yield next(seq)
        try:
            yield next(seq)
        except StopIteration:
            return

这将解决您的问题。我在这里添加了一些额外的上下文,因为我想查看输出。我对这个变化了解不多,只是从 问题中得到的。