Python bottle:如何将参数传递给函数处理程序

Python bottle: how to pass parameters into function handler

我试图在将 http GET 请求发送到特定路由时调用函数,但我想将参数传递给给定函数。例如,我有以下内容:

    self.app.route('/here', ['GET'], self.here_method)

其中 self.here_method(self) 在 GET 请求发送到 /here 路由时被调用。相反,我想调用方法 self.here_method(self, 'param')。我怎样才能做到这一点?我试过 self.app.route('/here', ['GET'], self.here_method, 'param'),但它不起作用。我查看了 this documentation,但找不到任何答案。

我没有使用 bottle 的经验,但 route 似乎需要一个不带任何参数的回调函数。为此,您可以围绕您的方法创建一些一次性包装器,它不接受任何参数。这通常使用由 lambda expression 定义的匿名函数来完成,例如:

self.app.route('/here', ['GET'], lambda: self.here_method(self, 'param'))

不清楚您是在询问如何将您的路线与闭包相关联,还是仅与采用参数的函数相关联。

如果您只想将参数作为 URI 的一部分,请使用 Bottle 的动态 path routing

另一方面,如果您想 "capture" 一个在路由定义时已知的值,并将其烘焙到您的路由处理程序中,则使用 functools.partial.

这是两者的示例。

from bottle import Bottle
import functools

app = Bottle()

# take a param from the URI
@app.route('/hello1/<param>')
def hello1(param):
    return ['this function takes 1 param: {}'.format(param)]

# "bake" in a param value at route definition time
hello2 = functools.partial(hello1, param='the_value')
app.route('/hello2', ['GET'], hello2)

app.run(host='0.0.0.0', port=8080)

及其输出示例:

% curl http://localhost:8080/hello1/foo
127.0.0.1 - - [11/Jul/2015 18:55:49] "GET /hello1/foo HTTP/1.1" 200 32
this function takes 1 param: foo

% curl http://localhost:8080/hello2
127.0.0.1 - - [11/Jul/2015 18:55:51] "GET /hello2 HTTP/1.1" 200 38
this function takes 1 param: the_value