pyramid.httpexceptions.HTTPNotFound: 找不到资源

pyramid.httpexceptions.HTTPNotFound: The resource could not be found

我正在研究 Safari 的金字塔教程

WEB APPLICATIONS WITH PYTHON AND THE PYRAMID FRAMEWORK

在我的 views.py 文件中,我遇到以下代码问题:

@property
def current(self):
    todo_id = self.request.matchdict.get('id')
    todo = sample_todos.get(todo_id)
    if not todo:
        raise HTTPNotFound()
    return todo

特别是当下面的视图函数调用这个时属性

@view_config(route_name='view', renderer='templates/view.jinja2')
def view(self):
    return dict(todo=self.current)

当我 运行 时,应用程序 http://0.0.0.0:6543/5 不会触发预期的 HTTPNotFound(),请参阅下面的路线。

config.add_route('view', '/{id}')

错误日志 return:

  File "/Users/alex/zdev/t-oreilly/mysite/views.py", line 50, in view
    return dict(todo=self.current)
  File "/Users/alex/zdev/t-oreilly/mysite/views.py", line 25, in current
    raise HTTPNotFound()
pyramid.httpexceptions.HTTPNotFound: The resource could not be found.

浏览器女服务员return默认服务器错误。

消除此错误的正确方法是什么?


我已将此作品上传至 github,提交 aaf562e

教程 link 是 here,对于那些渴望提供帮助的人,可以通过他们的 10 天试用版访问它。此问题来自视频 17/48.

谢谢,如果您需要更多信息,请告诉我。

这是一个不同的 HTTPNotFound 异常,它在您的视图执行之前的路由匹配步骤中引发。原因是你有config.add_route('view', '/{id}')。请注意 /{id} 不是 /{id}/。 Pyramid 考虑了这两条不同的路线,因此后者不匹配。最简单的解决方案是使用 / 后缀注册我们所有的规范路由,例如 /{id}/,然后将 append_slash=True 传递给未找到的视图配置,例如 config.add_notfound_view(..., append_slash=True)@notfound_view_config(append_slash=True)。当用户访问没有尾部斜杠的版本时,这将触发重定向。

在您的两个 Jinja 模板中,您引用了 @property view.current。但是,由于 属性 抛出 HTTPNotFound() 异常,您的 Jinja 模板最终会触发并爆炸,从而导致您的问题。

要么从您的 Jinja 模板中删除对 view.current 的调用,要么修改您的 view.current 函数,使其不会抛出异常。

我不确定这是否是您正在寻找的解决方案,但它没有偏离教程。