Python 使用遍历时如何生成要查看的URL?

Python 使用遍历时如何生成要查看的URL?,python,pyramid,traversal,Python,Pyramid,Traversal,使用URL分派时,我们可以轻松生成视图的URL,因为每个视图都有一个不同的路由名称,如: login.py: @view_config(route_name='login') index.pt: <a href="${request.route_url('login')}">Login</a> login.py: @查看\u配置(路由\u name='login') index.pt: 但是在遍历中如何做到这一点呢?由于没有可用的资源“Login”实例,我不知道如何

使用URL分派时,我们可以轻松生成视图的URL,因为每个视图都有一个不同的路由名称,如:

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

index.pt:
<a href="${request.route_url('login')}">Login</a>
login.py:
@查看\u配置(路由\u name='login')
index.pt:

但是在遍历中如何做到这一点呢?由于没有可用的资源“Login”实例,我不知道如何生成URL以查看登录。

(资源“view\u name”)

在遍历中,您需要知道树的结构,并且必须能够根据需要加载上下文对象。URL是根据上下文生成的,使用上下文的位置感知属性
\uuuuu name\uuuuuu
\uuuu parent\uuuuuu
来构建URL

/
|- login
|- users
   |- 1
      |- edit
假设我们有一个
User(id=1)
context对象,我们想要登录。如果您的视图是通过
@view\u config(context=Root,name='login')
注册的,那么您可以通过
request.resource\u url(request.Root,'login')
生成url。这是我们告诉金字塔生成一个相对于树的根的URL

另一方面,如果我们正在登录,并且希望让用户进行编辑,则必须为该用户加载位置感知的
user
对象,以便生成URL
request.resource\u url(user,'edit')
其中
user
user(id=1)
的一个实例,具有有效的
\uu name\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu和
父属性

如果您在没有位置感知的上下文中传递
\uuuuuu parent\uuuuuu
,则URL将生成,就像您的用户装载在
/
上一样,因为这是金字塔认为对象将位于树中的唯一合理位置


加载位置感知对象的能力就是为什么我们强调遍历最好使用持久的对象树,而不是动态生成的对象树。如果您想为用户生成URL,直接加载用户并为其填充
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?如果它是资源的实例,如何获取它?在上面的登录示例中,如何获取模板中的登录实例?ThanksIt是您注册“登录”视图的资源。假设它是根目录下名为“Auth”的Auth资源。而不是req.resource\uURL(req.root['auth'],'login'),对您的资源树一无所知这只是一个猜测。。。request.resource\uURL(request.context,“login”)或request.resource\uURL(request.root,“login”),但这一切都取决于您的资源树是如何为遍历而构建的感谢您的优秀答案!但是混合URL分派和遍历的混合应用程序呢?如何为这种应用程序生成URL?我相信混合应用程序有多个根,因为我们可以通过URL调度将遍历资源树装载到多个点。如何获取选定树的根对象?还是我的想法完全错了?谢谢对于在混合应用程序中生成URL,没有很好的支持。一般的想法是使用
request.resource\u path()
pyramid.traversal.resource\u path()
生成相对路径,然后将其连接到
request.route\u url()的结果。另一个选项是使用
request.route\u url('foo',traverse=path)
其中path是一个可能通过
pyramid.traversal.resource\u path\u tuple()检索的段元组。不太好看。:-)