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

16

举个例子,假设我已经按照如下方式设置了我的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

Traceback(最近的通话):
文件 "C:\Python26\lib\site-packages\cherrypy_cprequest.py", 第606行, 在响应中 cherrypy.response.body = self.handler() 文件 "C:\Python26\lib\site-packages\cherrypy_cpdispatch.py", 第27行, in call test_callable_spec(self.callable, self.args, self.kwargs) 文件 "C:\Python26\lib\site-packages\cherrypy_cpdispatch.py", 第130行, 在test_callable_spec中 "parameters: %s" % ", ".join(extra_qs_params)) HTTPError: (404, 'Unexpected query string parameters: var2')

由CherryPy 3.1.2提供支持


3
请取消对我的答案的采纳,并接受Coady的正确答案,这样我就可以删除我的答案。 - Michael Greene
2个回答

37
def index(self, var=None, **params):
或者
def index(self, **params):
'var2'将成为params字典中的一个键。在第二个示例中,'var'也是如此。 请注意,其他提及*args语法的答案在此情况下不起作用,因为CherryPy将查询参数作为关键字参数而不是位置参数传递。因此,您需要**语法。

1

为了完全的通用性,请更改

    def index(self, var = None):

    def index(self, *vars):

vars将被绑定到一个元组,如果没有传递参数,则为空,如果传递了一个参数,则为一个项目,如果传递了两个参数,则为两个项目,依此类推。当然,如何合理和适当地处理各种这样的情况取决于您的代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接