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

时间:2015-11-25 18:10:49

标签: python bottle

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

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

瓶子文档严重依赖@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感到困惑。

2 个答案:

答案 0 :(得分:2)

接受的答案并不能很好地解决你的问题,所以我会加入进来。你似乎试图使用Bottle的static_file作为路线目标,但是&#&# 39;不应该以那种方式使用。正如您引用的示例所示,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

希望这有帮助。

答案 1 :(得分:1)

因为你想使用单一方法,你必须自己将参数传递给static_file,并使用re来解析它们。

代码如下所示:

from bottle import Router

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

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

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