我正在尝试使用烧瓶服务器来获取通过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
函数是否有可以处理此问题的选项?
答案 0 :(得分:6)
您需要正确编码查询参数;在URL query paramater encoding中,空格被编码为+
,而+
本身则被编码为%2B
。
不能告诉Flask以不同方式处理特定数据;你无法可靠地检测出哪些数据被正确编码,哪些数据没有被正确编码。但是,您可以手动从查询字符串中提取参数,方法是使用request.query_string
。
更好的方法是正确地转义参数(例如,在JavaScript中,使用encodeURIComponent()
)。 +
字符不是Base64编码值中唯一有问题的字符;该格式还使用/
和=
,两者都在网址中包含含义。
实际上,可能是=
URL末尾的data:
字符缺失,是导致错误填充错误消息的更直接原因。如果您将其添加回来,那么下一步确实会将所有+
个字符解码为' '
时出现问题。