Python 如何将挂架中的/{controller}/{action}/{id}路由移植到金字塔

Python 如何将挂架中的/{controller}/{action}/{id}路由移植到金字塔,python,pyramid,porting,pylons,Python,Pyramid,Porting,Pylons,因此,我正在移植一些旧的Py2/Pylons应用程序,它有第3节中定义的路由,这在Pyramid中是不可能的,那么如何处理呢 我对塔架和金字塔都不太熟悉,所以如果很明显的话,我还是想要一个提示 我有8个控制器,每个控制器有~2-5个动作,其中只有一些使用{id},我想我需要用单独的route_名称来修饰每个控制器中的每个动作函数,但不使用任何id的控制器除外: @view_defaults(renderer='go.pt', route_name='go') class GoView:

因此,我正在移植一些旧的Py2/Pylons应用程序,它有第3节中定义的路由,这在Pyramid中是不可能的,那么如何处理呢

我对塔架和金字塔都不太熟悉,所以如果很明显的话,我还是想要一个提示

我有8个控制器,每个控制器有~2-5个动作,其中只有一些使用{id},我想我需要用单独的route_名称来修饰每个控制器中的每个动作函数,但不使用任何id的控制器除外:

@view_defaults(renderer='go.pt', route_name='go')
class GoView:
    def __init__(self, request):
        self.request = request

    @view_config(match_param="action=list")
    def list(self):
        return {'name': 'Go list'}

    @view_config(route_name='go_edit')
    def edit(self):
        return {'name': 'Go edit id: {}'.format(self.request.matchdict["id"])}

    config.add_route("go", "/go/{action}"). # deals with all non-id routes pr controller
    config.add_route("go_edit", "/go/edit/{id}") # one for each controller+action using id

然而,与塔架代码相比,我需要添加相当多的路线-这是犹太金字塔风格,还是有更好的方式?事实上,为每个操作添加特定的路由是否更好,无论它是否使用ID,即使它会生成更多对config.add_route的调用?

金字塔本身需要精确的路由定义。您可以编写类似的帮助程序

def add_action_routes(config, name, path=None):
    if path is None:
        path = name
    if not path.endswith('/'):
        path += '/'
    config.add_route(name, path)
    config.add_route(name + '_action', path + '{action}')
    config.add_route(name + '_id', path + '{action}/{id}')

add_action_routes(config, 'go')
然后,您可以使用您认为合适的
view\u defaults
view\u config
将视图连接到这些路由。另一方面,您可以创建自己的url生成器,该生成器可以正确地生成正确格式的url

def make_action_url(request, name, action=None, id=None, **kw):
    if action is None:
        return request.route_url(name, **kw)
    if id is None:
        return request.route_url(name + '_action', action=action, **kw)
    return request.route_url(name + '_id', action=action, id=id, **kw)

config.add_request_method(make_action_url, 'action_url')

这将允许您的代码使用
request.action\u url(…)
生成url,而不必过多地考虑路由名称。

虽然不是您问题的答案,但您的第二条路由永远不会匹配。你需要交换他们的订单。请参阅以获取解释。至于如何以及在何处配置路由,请看一下和其他。奇怪的是,第二个url似乎确实在使用/go/edit/123时起作用。我确实达到了编辑方法。我看了这个例子,但是我没有看到任何银弹在那里,如果我应该-谢谢你的帮助顺便说一句…啊,我的错误。斜杠是很重要的。无论如何,关于路由配置,最好将配置与类分开,并将它们放在一个地方,因为当匹配的路由分散在代码中时,尝试调试它们可能会很棘手。