提供静态文件时如何将@bottle.route转换为bottle.route()?

How to convert @bottle.route to bottle.route() when serving static files?

我通常使用method version来处理bottle中的路由

bottle.route("/charge", "GET", self.charge)

bottle 文档严重依赖 @route 装饰器来处理路由,我有一个案例不知道如何转换成我最喜欢的版本。 serving static files 上的文档使用示例

from bottle import static_file

@route('/static/<filename:path>')
def send_static(filename):
    return static_file(filename, root='/path/to/static/files')

有没有办法把它变成某种

bottle.route("/static", "GET", static_file)

施工?特别是我对如何将 filenameroot 参数传递给 static_file.

感到困惑

既然要用single方法,就必须自己给static_file传递参数,先用re解析。

代码如下所示:

from bottle import Router

app.route('/static/:filename#.*#', "GET", static_file(list(Router()._itertokens('/static/:filename#.*#'))[1][2], root='./static/'))

这有点长,如果你想在外面解析参数,那么你可以添加另一个解析函数。

我知道你想让你所有的路由器看起来干净整洁,但是装饰器是为了丰富功能但保持功能本身干净,对于AOP,所以为什么不尝试在这种情况下使用装饰器。

接受的答案并不能很好地解决您的问题,所以我会插话。您似乎在尝试使用 Bottle 的 static_file 作为路由目标,但它并不意味着要那样使用.正如您引用的示例所示,static_file 旨在从 路由目标函数中调用。这是一个完整的工作示例:

import bottle

class AAA(object):
    def __init__(self, static_file_root):
        self.static_file_root = static_file_root

    def assign_routes(self):
        bottle.route('/aaa', 'GET', self.aaa)
        bottle.route('/static/<filename:path>', 'GET', self.send_static)

    def aaa(self):
        return ['this is aaa\n']

    def send_static(self, filename):
        return bottle.static_file(filename, self.static_file_root)

aaa = AAA('/tmp')
aaa.assign_routes()
bottle.run(host='0.0.0.0', port=8080)

用法示例:

% echo "this is foo" > /tmp/foo
% curl http://localhost:8080/static/foo
this is foo

希望对您有所帮助。