我正在使用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。
谢谢,如果您需要更多信息,请告诉我。
答案 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
函数,使其不会抛出。
我不确定这是否是您正在寻找的解决方案,但它并没有偏离教程。