【问题标题】:Problem returning 2 elements from within a view function从视图函数中返回 2 个元素的问题
【发布时间】:2018-09-25 20:24:02
【问题描述】:

因为现在下面的代码不能返回一个元组,有 2 个元素,第一个是一个字符串,然后是一个响应方法。

@app.route( '/file', methods=['POST'] )
def file():

    pdata = ''
    pdata = pdata + '''<img src="/static/img/arrow.gif" align="left">'''
    filepath = '/home/nikos/public_html/static/files/'

    return pdata, static_file( filename, root=filepath, download=True )

返回的错误是:

Critical error while processing request: /file
Error:
TypeError('sequence item 1: expected str instance, HTTPResponse found',)
Traceback:
Traceback (most recent call last):
  File "/usr/lib/python3.6/site-packages/bottle.py", line 954, in wsgi
    out = self._cast(self._handle(environ))
  File "/usr/lib/python3.6/site-packages/bottle.py", line 894, in _cast
    out = out[0][0:0].join(out) # b'abc'[0:0] -> b''
TypeError: sequence item 1: expected str instance, HTTPResponse found

在将文件返回给用户之前打印字符串的最简单方法是什么?

【问题讨论】:

  • 如果您认为该问题(和答案)将来对其他人有用,您可以自行回答自己的问题。如果您认为它没有任何用处(例如,解决方案是一件完全无关的微不足道的事情),您可以自己删除自己的问题。
  • 请删除您的评论,因为它不是我问题的答案。
  • 评论不是答案;这是一条评论。
  • 顺便问一下,您是否解决了问题,或者您没有解决问题?我看到你已经删除了你说你修复了问题的评论,所以我认为它没有修复。
  • 我 deix 的评论是我遇到的语法错误。问题仍然存在。请删除你所有的cmets,我会删除回复你的oens。

标签: python bottle


【解决方案1】:

这可能是一个文档错误,或者至少在文档中有些不清楚:支持混合迭代。

在文档的Generating content 部分中,它告诉您可以返回可迭代对象和生成器等。在那个要点中,它指出

您可以 [...] 返回一个可迭代对象,只要该可迭代对象产生字节字符串、Unicode 字符串、HTTPError 或 HTTPResponse 实例。

这个可以被解释为返回一个包含字节或unicode字符串的组合或HTTPError或HTTPResponse实例的迭代。

然而,查看代码会发现情况并非如此。特别是,从您列出的错误(大约第 894 行)中获取回溯,显示 the current master on GitHub 的以下内容:

# Join lists of byte or unicode strings. Mixed lists are NOT supported
if isinstance(out, (tuple, list))\
and isinstance(out[0], (bytes, unicode)):
    out = out[0][0:0].join(out) # b'abc'[0:0] -> b''

这段代码完全按照注释中所说的(包括“不支持混合列表”):它对字符串列表执行.join()。由于它只检查第一项以查看它是否为字符串,并且代码中的第一项确实是字符串,因此它加入了列表,当发现第二个元素不是字符串时会惨遭失败。

该代码注释的后半部分可能应该包含在文档中以进行澄清。

【讨论】:

  • 我明白了,所以现在我必须做些什么来先返回字符串然后返回 HTTP 响应?!
  • 这主要是另一个问题。你想要的,不简单。或者尝试将您的第一个字符串包装在 HTTPResponse 中。
  • 或者也许通过使用html模板作为中间人这可以实现?
猜你喜欢
  • 1970-01-01
  • 2011-04-08
  • 2020-01-12
  • 2019-09-17
  • 1970-01-01
  • 2023-04-03
  • 2016-05-23
  • 2017-03-20
  • 2012-06-05
相关资源
最近更新 更多