当我为我的项目寻找相同的东西时找到了这个解决方案
def add_auto_route(config,name, pattern, **kw):
config.add_route(name, pattern, **kw)
if not pattern.endswith('/'):
config.add_route(name + '_auto', pattern + '/')
def redirector(request):
return HTTPMovedPermanently(request.route_url(name))
config.add_view(redirector, route_name=name + '_auto')
然后在路由配置过程中,
add_auto_route(config,'events','/events')
而不是做config.add_route('events','/events')
基本上它是你的方法的混合体。定义了一个名称以 结尾的新路由,_auto
其视图重定向到原始路由。
编辑
该解决方案不考虑动态 URL 组件和 GET 参数。对于像这样的 URL /abc/{def}?m=aasa
,使用add_auto_route()
会抛出一个关键错误,因为该redirector
函数没有考虑到request.matchdict
。下面的代码就是这样做的。要访问 GET 参数,它还使用_query=request.GET
def add_auto_route(config,name, pattern, **kw):
config.add_route(name, pattern, **kw)
if not pattern.endswith('/'):
config.add_route(name + '_auto', pattern + '/')
def redirector(request):
return HTTPMovedPermanently(request.route_url(name,_query=request.GET,**request.matchdict))
config.add_view(redirector, route_name=name + '_auto')