如何返回包含模板变量的字典

时间:2015-06-24 00:41:51

标签: python dictionary web bottle templating

我正在使用python web框架Bottle来生成html模板,我想将模板变量的字典从瓶子服务器传递到页面。 documentation表示可以这样做:

@route(’/hello/<name>’)
@view(’hello_template’)
def hello(name=’World’):
  return dict(name=name)

@view模板应该可以访问name。我想用搜索结果字典做同样的事情,简化到这里:

@get('/search')
@view('search')
def search():
    // load results
    // return results
    results = {'1': {'param1': 'val1', 'param2': 'val2', 'param3': 'val3'},
               '2': {'param1': 'val1', 'param2': 'val2', 'param3': 'val3'}
              }
    return results

但是我收到了这个错误:

TypeError('template() keywords must be strings',)

使用此追溯:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/bottle.py", line 862, in _handle
    return route.call(**args)
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/bottle.py", line 1732, in wrapper
    rv = callback(*a, **ka)
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/bottle.py", line 3619, in wrapper
    return template(tpl_name, **tplvars)
TypeError: template() keywords must be strings

我可以找到类似的问题,但他们都认为params可以正确通过,所以我决定问。谢谢!

1 个答案:

答案 0 :(得分:-1)

我真的不明白你是怎么得到这个错误的,但无论如何你的代码等于:

@route('/search')
def search():
    return template('search', **results)

**表示template()函数必须将results解包为关键字参数。换句话说,这段代码:

@route('/')
def index()
    return template(template_name, **{'a': 1, 'b': 2})

Absolutley等于:

@route('/')
def index():
    return template(template_name, a=1, b=2)

甚至等于这个:

@route('/')
@view(template_name)
def index():
    return {'a': 1, 'b': 2}

现在问问自己如何在模板中访问名为12的变量(您尝试使用此变量)?

在您的情况下template()函数将results解包为关键字参数。 如果您想将results传递到模板中,请使用return dict(results=results)

但是如果你提供真正的代码,我想你会得到更详细的答案