使用 Flask-RESTful 解析非 Unicode 字符串



我有一个用Flask-RESTful开发的webhook,它通过POST获得了几个参数。 其中一个参数是非 Unicode 字符串,以cp1251编码。

找不到使用reqparse正确解析此参数的方法。

这是我的代码片段:

parser = reqparse.RequestParser()
parser.add_argument('text')
msg = parser.parse_args()

然后,我将msg写入文本文件,它看起来像这样:

{"text": "ufffdufffdufffdufffdufffdufffdufffd !nnufffdufffdufffdufffdufffdnn-- nufffd ufffdufffdufffdufffdufffdufffdufffdufffdufffd."}

如您所见,Flask 以某种方式将所有西里尔字符替换为ufffd.同时,非西里尔字符(如!n(得到正确处理。

我能做些什么来建议 RequestParser 使用字符串编码?

这是我将文本写入磁盘的代码:

f = open('log_msg.txt', 'w+')
f.write(json.dumps(msg))
f.close()

我尝试f = open('log_msg.txt', 'w+', encoding='cp1251')相同的结果。

然后,我尝试了

f = open('log_msg_ascii.txt', 'w+')
f.write(ascii(json.dumps(msg)))

另外,没有区别。

所以,我很确定RequestParser()试图太聪明并且无法理解非Unicode输入。

谢谢!

好的,我终于找到了解决方法。感谢@lenz帮助我解决这个问题。似乎reqparse错误地假设每个字符串参数都是 UTF-8。因此,当它看到一个非Unicode输入字段(以及其他Unicode字段!(时,它会尝试将其加载为Unicode并失败。因此,所有字符都U+FFFD(替换字符(。

因此,要访问该非Unicode字段,我做了以下技巧。

首先,我使用get_data()加载原始数据,使用 cp1251 对其进行解码并使用简单的正则表达式进行解析。

raw_data = request.get_data()
contents = raw_data.decode('windows-1251')
match = re.search(r'(?P<delim>--w+r?n)Content-Disposition: form-data; name="text"r?n(.*?)(?P=delim)', contents, re.MULTILINE | re.DOTALL)
text = match.group(2)

不是最美丽的解决方案,但它有效。

最新更新