【问题标题】:how to return a dictionary with template variables如何返回带有模板变量的字典
【发布时间】:2015-09-10 00:27:56
【问题描述】:

我正在使用python web 框架Bottle 来生成html 模板,并且我想将一个模板变量字典从bottle 服务器传递到页面。 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

我可以找到类似的问题,但他们都认为参数可以正确传递,所以我决定问。谢谢!

【问题讨论】:

  • template() keywords must be strings你的关键字是字符串吗?
  • 我不确定——我没有明确调用 template(),因为我使用的是 @view 装饰器
  • 尝试将字符串转换为int:{1: {'param1': 'val1', 'param2': 'val2', 'param3': 'val3'}, 2: {'param1': 'val1', 'param2': 'val2', 'param3': 'val3'} }
  • 您也可以发布您的模板吗?

标签: python dictionary web bottle templating


【解决方案1】:

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

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

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

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

绝对等于这个:

@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)

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

【讨论】:

  • 但那些只是用作字典中的键的字符串,对吧?它们是数字无关紧要
  • 我提供了更详细的答案,也许它可以帮助你
猜你喜欢
  • 1970-01-01
  • 2021-02-27
  • 2011-09-02
  • 1970-01-01
  • 2017-07-16
  • 2011-12-21
相关资源
最近更新 更多