Flask:flask.request.args.get用url中的空格替换'+'

Aly*_*Aly 8 python flask asp.net-web-api

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

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

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

但我得到的问题是

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
Run Code Online (Sandbox Code Playgroud)

在进一步检查(即打印烧瓶获得的图像)时,似乎+字符被字面空间替换,这似乎是搞砸了.

是否有flask.args.get可以处理此功能的功能选项?

Mar*_*ers 9

您需要正确编码查询参数; 在URL查询参数编码中,空格被编码为+,而+其自身被编码为%2B.

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

更好的做法是正确的逃生参数(在JavaScript中,使用encodeURIComponent()等).该+字符不是Base64编码值中唯一有问题的字符; 格式也使用/=,它们都带有URL的含义.

实际上,可能=是该data:URL 末尾的字符缺失,这是错误填充错误消息的更直接原因.如果你把它添加回来,你接下来确实会遇到所有+被解码的字符的问题' '.