tornado處理表單提交的中文數據

背景描述

前端通過表單提交了帶有中文的數據,後端想對這些數據進行處理。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,但是實際解析起來發現,雖然可以顯示中文,結果類似:
在這裏插入圖片描述

但是還有其他的問題:

  1. body中還多了指定的分隔符,形如------WebKitFormBoundarySUFFIX,其中的每post一次,SUFFIX都會變化
  2. 如果有內容,body還會多一個Content-Disposition: form-data;

其實這是一個關於http協議處理的問題,我沒有進一步瞭解。覺得這篇博客整理的很簡明。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章