背景描述
前端通过表单提交了带有中文的数据,后端想对这些数据进行处理。request.body
是一个binary
变量,虽然可以将之解码为utf8
但仍然不是中文形式,类似于
%E8%BF%98%E6%AC%BE%E6%88%90%E5%8A%9F%E9%A1%B5
查过相关回答后,我找到一种可行的办法,在此记录一下。
解决方法
前端HTML文件指定form
表单的相关参数,如下:
<form action="/" method="post" accept-charset="UTF-8" enctype="application/x-www-form-urlencoded">
</form>
后端post
过程如下:
import tornado
import urllib.parse
class MyTestHandler(tornado.web.RequestHandler):
def get(self):
self.render('test.html')
def post(self):
body = self.request.body.decode('utf8')
body = urllib.parse.unquote(body)
print(body)
# something else
# self.render('test.html')
我的前端结果输入了两句中文文本
结果如下:
文案内容_0=这是一个测试文案&文案内容_1=这是另一个测试文案
学习笔记
注意enctype这个参数,我之前使用的是multipart/form-data
,但是实际解析起来发现,虽然可以显示中文,结果类似:
但是还有其他的问题:
- body中还多了指定的分隔符,形如
------WebKitFormBoundarySUFFIX
,其中的每post一次,SUFFIX
都会变化 - 如果有内容,body还会多一个
Content-Disposition: form-data;
其实这是一个关于http协议处理的问题,我没有进一步了解。觉得这篇博客整理的很简明。