背景描述
前端通過表單提交了帶有中文的數據,後端想對這些數據進行處理。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協議處理的問題,我沒有進一步瞭解。覺得這篇博客整理的很簡明。