CherryPy 3.2中的Trailing Slash工具不添加尾部斜杠

时间:2012-04-23 06:56:16

标签: python routing cherrypy trailing-slash

我无法使用trailing_slash工具。我玩过 trailing_slash工具的选项似乎没有任何效果。 我使用的是CherryPy 3.2.2和Routes 1.13。我想要一个 尾随斜线添加。调试输出中没有错误。

如果我去127.0.0.1:8080/blog/它可行,但是如果我去的话 到127.0.0.1:8080/blog它没有。

我的配置是:

conf = {
'/': {
    'request.dispatch': setup_routes(),
    # This trailing slash stuff has no effect :(
    'tools.trailing_slash.on': True,
    'tools.trailing_slash.missing': True,
    'tools.trailing_slash.status': 301,
},
'/static': {
       'tools.staticdir.on': True,
       'tools.staticdir.root': os.path.dirname(os.path.abspath(__file__)),
       'tools.staticdir.dir': 'static'
   }
}

示例路线是:

routes = [["blog_index", "/blog/", {'controller': BlogController(), 'action': 'index','entry_id': 'index'}],]

有人能看出我做错了什么吗?有没有错误或缺乏 基本文件? trailing_slash工具是否适用于Routes Dispatcher?

完整的src:https://bitbucket.org/ddevine/icdy/src

3 个答案:

答案 0 :(得分:1)

尾部斜杠工具不适用于Routes Dispatcher。尾部斜杠工具期望无论选择何种调度程序,都会将cherrypy.request.is_index设置为True或False,看起来RoutesDispatcher类根本不执行。因此,is_index保留为None,并且尾部斜杠工具不执行任何操作。对于具有良好Routes知识的人来说,可能有可能在CherryPy代码库中修复它,或者编写自己的调度程序来设置is_index,或者尝试编写另一个修复is_index的工具。

答案 1 :(得分:0)

路由中没有“索引”的概念,因为您可以定义同一路径的2个连接,一个带有尾部斜杠,另一个没有,并将它们连接到2个完全不同的控制器和/或操作。你不会在现实生活中这样做,但它可能在Routes中,所以真的没有一个好方法来改变trailing_slash工具来解决这个问题。

恕我直言,trailing_slash工具有点缺乏,它可能应该提升到位于默认WSGI中间管道前面的WSGI中间件的水平,就像现在正在使用CherryRy的InternalRedirect中间件一样。例如,如果您在script_name下安装了RouteDispatcher,则无法将trailing_slash工具放在任何位置以使CP在script_name之后放置一个尾部斜杠,因为Routes中的所有路径都必须以斜杠开头,并且它将抛出一个如果在尝试匹配时path_info是空字符串,则为RoutesException。

答案 2 :(得分:0)

很长一段时间问道,但这是一种让它发挥作用的方法:

def index(index=True):
    cherrypy.request.is_index = index
cherrypy.tools.index = cherrypy.Tool('on_start_resource', index)

config = {
    ...
        'tools.trailing_slash.status': 307,
        'tools.index.on': True,
    ...
}