Flask:flask.request.args.get在URL中用空格替换“+”

10

我正尝试使用Flask服务器为API提供服务,通过HTTP GET参数接收图像URL。

我正在使用这个非常长的url示例(在pastebin上),其中包含许多在URL中使用的+。我在我的Flask服务器中设置了以下路由:

@webapp.route('/example', methods=['GET'])
def process_example(): 
    imageurl = flask.request.args.get('imageurl', '')
    url = StringIO.StringIO(urllib.urlopen(imageurl).read())
    ...

但我遇到的问题是

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/aly/anaconda/lib/python2.7/urllib.py", line 87, in urlopen
    return opener.open(url)
  File "/Users/aly/anaconda/lib/python2.7/urllib.py", line 208, in open
    return getattr(self, name)(url)
  File "/Users/aly/anaconda/lib/python2.7/urllib.py", line 597, in open_data
    data = base64.decodestring(data)
  File "/Users/aly/anaconda/lib/python2.7/base64.py", line 321, in decodestring
    return binascii.a2b_base64(s)
binascii.Error: Incorrect padding

经进一步检查(即打印Flask获取的图片URL),似乎+字符被替换为字面空格,这似乎会导致问题出现。

flask.args.get函数有没有处理这个问题的选项?

1个回答

14

您需要正确地对查询参数进行编码;在URL查询参数编码中,空格会被编码为+,而+本身则被编码为%2B

Flask不能告诉你如何处理特定的数据;您无法可靠地检测出哪些数据已经正确编码和哪些没有。但您可以通过使用request.query_string手动从查询字符串中提取参数。

更好的方法是正确地转义您的参数(例如,使用JavaScript中的encodeURIComponent()函数)。在Base64编码值中,+字符不是唯一的问题字符;该格式还使用/=,这两个字符在URL中具有意义,这就是为什么有一个URL安全变体的原因。

事实上,可能正是那个data: URL末尾缺少的=字符导致了错误的填充错误消息。如果您将其添加回去,您可能会遇到所有的+字符已经被解码为' '的问题。


@Martijin_Pieters 你好,实际上我并不是从网页输入URL,而是直接调用 <server>:<port>/example?imageurl=<url>。因此我认为这必须在Flask层面完成。那么request.query_string是否合适呢? - Aly
1
@Aly:那么您仍然需要负责对参数进行编码。您需要调用 <server>:<port>/example?imageurl=<encoded-url> - Martijn Pieters

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