如何在使用Traversal时生成要查看的URL?

Lin*_*ong 4 python traversal pyramid

使用URL Dispatch时,我们可以轻松生成视图的URL,因为每个视图都有一个不同的route_name,如:

login.py:
@view_config(route_name='login')

index.pt:
<a href="${request.route_url('login')}">Login</a>
Run Code Online (Sandbox Code Playgroud)

但是如何在遍历中执行此操作?由于没有可用的资源"登录"实例,我不知道如何生成URL来查看登录.

Mic*_*kel 8

在遍历中,您需要知道树的结构,并且必须能够按需加载上下文对象.URL是根据上下文生成的,使用其位置感知属性__name____parent__构建URL.

/
|- login
|- users
   |- 1
      |- edit
Run Code Online (Sandbox Code Playgroud)

所以假设我们有一个User(id=1)上下文对象,我们想登录.如果您的视图是通过注册的@view_config(context=Root, name='login'),那么您可以生成网址request.resource_url(request.root, 'login').这是我们告诉Pyramid生成相对于树的根的URL.

另一方面,如果我们在登录并且我们想要让用户进行编辑,则必须为该用户加载位置感知User对象以生成URL.request.resource_url(user, 'edit')where userUser(id=1)具有有效__name____parent__属性的实例.

如果您传入的上下文没有位置感知__parent__,则会生成URL,就像您的用户已安装在/那里一样,因为这是Pyramid认为对象将在您的树中唯一理智的地方.

加载位置感知对象的能力是我们强调遍历最适合持久的对象树而不是动态生成的对象的原因.它更方便,直接加载用户,并有其__parent____name__已经为您填充,如果你想为它生成的URL.