1

我无法让 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 一起使用?

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

4

3 回答 3

1

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

于 2012-04-23T14:22:45.660 回答
1

长时间问,但这里有一种方法可以使它工作:

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,
    ...
}
于 2015-09-24T16:53:26.637 回答
0

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

恕我直言,trailing_slash 工具有点欠缺,它可能应该提升到位于默认 WSGI 中间管道前面的 WSGI 中间件的级别,就像现在 CherryPy 中的 InternalRedirect 中间件一样。例如,如果您在 script_name 下安装了 RouteDispatcher,则不能将 trailing_slash 工具放在任何地方让 CP 在 script_name 后放置一个斜杠,因为 Routes 中的所有路由都必须以斜杠开头,它会抛出一个如果您尝试匹配时 path_info 为空字符串,则出现 RoutesException。

于 2012-05-04T22:14:51.307 回答