背景
因为业务需要,部分的数据来自厂家异步通知,厂家使用的是POST方式提交相关json串过来。
提交过来的时候:日志里使用
这种方式记录日志,再windows上本地调试的时候写入会报错,引起无法写入。
而再linux上写入是正常可以写入,不会报错!但是记录到的信息会有乱码:
而再windows写入日志信息报错的信息如下:
--- Logging error ---
Traceback (most recent call last):
File "D:\Python35-32\lib\logging\__init__.py", line 982, in emit
stream.write(msg)
UnicodeEncodeError: 'gbk' codec can't encode character '\xe5' in position 1329: illegal multibyte sequence
Call stack:
大概原因就是使用:
urllib.parse.unquote(str(request.params.__dict__)
-------2018年5月24日 23:50:05 更新------
尝试解决方案:
在对unicode字符编码时,添加ignore参数,忽略无法无法编码的字符,这样就可以正常编码为GBK了
如: 你的字符串.encode(“GBK“, ‘ignore’);
urllib.parse.unquote(str(request.params.__dict__).encode('GBK', 'ignore'))
但是上面的这种方式会把整个的所有的字符串都给忽略了!!!
本地模拟异步通知
使用POSTMAN进行模拟提交:
第一步,设置相关的头部信息:
第二步:Body中选中RAW提交相关json串
提交测试:(因为json有一定的顺序要求)
第一种:request.POST提取json传的方式
for lkk in request.POST:
if lkk:
jsjdsjj = lkk
print(lkk)
打印出来的结果是:
第二种:request.json提取json传的方式
而使用request.json读取的方式,虽然说不会出现乱码,但是因为需要排序,而且顺序不能乱,因为加密的时候用到!!!
str(request.json)
第三种:request.body.readlines()提取json传的方式
结果转换到字符串的时候报错了!!
第四种:request._get_body_string()和data= request.body.read()提取json传的方式
发现这个方法可以哟!!!妈蛋!不过他获取出来的数据是会换行的!
需要进行替换一下:
str(data, encoding="utf-8").replace('\r\n','').replace(' ', '')