【Flask】關於request.json /.values /.args /.form

AlllenShen發表於2019-05-10

這篇文章和你看到的其他的可能有出入,看完了可以去試試

這個問題網上很多帖子說到,隨便一搜就行。我今天說一下用Flask做後端,Vue做前端的一些經驗。

跨域出門左轉flask-CORS,別用JSONP,那個基本是一群技術宅hack出來的

前端請求

我這裡用的是vue-resource。以POST為例

this.$http.post(
    this.url,
    this.form,
    {emulateJSON:true}
).then(function (res) {
    console.log(res);
})
複製程式碼

這個{emulateJSON:true}很多講vue-resource的部落格都說讓你加上,我的意見是呢,不加。 如果加了的話,header會有 Content-Type: application/x-www-form-urlencoded Flask會把它作為正常表單處理,也就是鍵值對。這就有個問題,傳陣列等資料結構會很麻煩,因為表單會對陣列進行拆分傳輸,就不細說了,google一下很多。

不加這個,預設 Content-Type: application/json Flask會處理為json資料,這樣子很多js陣列和物件都可以直接被解析成json,非常方便。

我估摸那些文章應該是SPA流行起來之前寫的

後端接收資料

這個地方就會涉及到用哪一個的問題。我的辦法比較蠢,開debug,用postman發請求,一個個看資料什麼樣。

所以我就發現了和網上文章有出入的地方

首先,很多文章說values可以訪問所有資料。沒錯,如果是post表單或者get的話。這也是前面很多人說使用{emulateJSON:true}一個原因,不用糾結啊。

表單的資料同樣可以在form中訪問,具體有什麼區別我也忘了,估摸著應該是

values = args + form

我是寫程式碼突然想起來寫這篇文章的,懶得去測試了,如果有問題告訴我我改一下

Content-Type: application/json時,資料會全部被存放在json中,其他部分是空的。

相容的寫法

data = request.json.get('data') or request.values.get('data')
複製程式碼

總結一哈

args: get引數 form: post表單 values: args + form json: json資料

相關文章