Flask:flask.request.args.get替换' +'在url中有空格

时间:2015-03-11 11:45:06

标签: python flask asp.net-web-api

我正在尝试使用烧瓶服务器来获取通过http get参数获取图像URL的api。

我正在使用这个url example,它非常长(在pastebin上)并且在网址中包含许多+个。我在烧瓶服务器中设置了以下路线

@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.args.get函数是否有可以处理此问题的选项?

1 个答案:

答案 0 :(得分:6)

您需要正确编码查询参数;在URL query paramater encoding中,空格被编码为+,而+本身则被编码为%2B

不能告诉Flask以不同方式处理特定数据;你无法可靠地检测出哪些数据被正确编码,哪些数据没有被正确编码。但是,您可以手动从查询字符串中提取参数,方法是使用request.query_string

更好的方法是正确地转义参数(例如,在JavaScript中,使用encodeURIComponent())。 +字符不是Base64编码值中唯一有问题的字符;该格式还使用/=,两者都在网址中包含含义。

实际上,可能是= URL末尾的data:字符缺失,是导致错误填充错误消息的更直接原因。如果您将其添加回来,那么下一步确实会将所有+个字符解码为' '时出现问题。