如何强制cherrypy接受可变数量的GET参数?

16 投票
2 回答
12483 浏览
提问于 2025-04-15 17:34

比如说,我的cherrypy索引模块是这样设置的:

>>> import cherrypy
>>> class test:
        def index(self, var = None):
            if var:
                print var
            else:
                print "nothing"
        index.exposed = True

>>> cherrypy.quickstart(test())

如果我发送超过一个的GET参数,就会出现这个错误:

404 找不到

意外的查询字符串参数: var2

错误追踪(最近的调用在最前面):
文件 "C:\Python26\lib\site-packages\cherrypy_cprequest.py", 第606行,在respond中 cherrypy.response.body = self.handler() 文件 "C:\Python26\lib\site-packages\cherrypy_cpdispatch.py", 第27行,在 call 中 test_callable_spec(self.callable, self.args, self.kwargs) 文件 "C:\Python26\lib\site-packages\cherrypy_cpdispatch.py", 第130行,在test_callable_spec中 "参数: %s" % ", ".join(extra_qs_params)) HTTPError: (404, '意外的查询字符串 参数: var2')

由CherryPy 3.1.2提供支持

2 个回答

1

为了让这个内容更通用,我们需要把

    def index(self, var = None):

改成

    def index(self, *vars):

vars 将会绑定到一个元组上。如果没有传递任何参数,这个元组就是空的;如果传递了一个参数,它里面就有一个元素;如果传递了两个参数,它里面就有两个元素,依此类推。接下来,你的代码需要合理地处理这些不同的情况。

37
def index(self, var=None, **params):

或者

def index(self, **params):

'var2'将会成为params字典中的一个键。在第二个例子中,'var'也会成为一个键。

注意,其他提到*args语法的回答在这种情况下是行不通的,因为CherryPy会把查询参数当作关键字参数传递,而不是位置参数。因此,你需要使用**语法。

撰写回答