使用 Flask-RESTful 解析非 Unicode 字符串
Parsing a non-Unicode string with Flask-RESTful
我有一个用 Flask-RESTful 开发的 webhook,它用 POST 获取几个参数。
其中一个参数是非 Unicode 字符串,编码为 cp1251。
找不到使用 reqparse
.
正确解析此参数的方法
这是我的代码片段:
parser = reqparse.RequestParser()
parser.add_argument('text')
msg = parser.parse_args()
然后,我将 msg
写入一个文本文件,它看起来像这样:
{"text": "\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd !\n\n\ufffd\ufffd\ufffd\ufffd\ufffd\n\n-- \n\ufffd \ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd."}
如您所见,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)
不是最漂亮的解决方案,但它确实有效。
我有一个用 Flask-RESTful 开发的 webhook,它用 POST 获取几个参数。 其中一个参数是非 Unicode 字符串,编码为 cp1251。
找不到使用 reqparse
.
这是我的代码片段:
parser = reqparse.RequestParser()
parser.add_argument('text')
msg = parser.parse_args()
然后,我将 msg
写入一个文本文件,它看起来像这样:
{"text": "\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd !\n\n\ufffd\ufffd\ufffd\ufffd\ufffd\n\n-- \n\ufffd \ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd."}
如您所见,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)
不是最漂亮的解决方案,但它确实有效。