pyramid.httpexceptions.HTTPNotFound:找不到资源

时间:2017-08-31 20:10:49

标签: python exception-handling pyramid

我正在使用Safari的Pyramid教程

  

使用PYTHON和PYRAMID框架的WEB应用程序

在我的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}')

错误日志返回:

  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.

在浏览器上,女服务员返回默认服务器错误。

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

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

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

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

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

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