04 Python Flask 教學10 所有文章

【Flask教學系列】實作 Flask 序列化 和 反序列化 方法

Flask教學_ Marshmallow_序列化_Max行銷誌

ㄧ. 什麼是序列化和反序列化?

簡單來說:序列化和反序列化,可使資料易於儲存和傳輸。

1. 序列化負責將對象 (Object) 轉換為可傳輸的標準格式。
2. 反序列化負責將可傳輸的標準格式轉換成對象 (Object)。

如果要在不同的程式語言之間傳遞對象,就必須把對象序列化為標準格式,常見的標準格式有 XML 或 JSON。

而本篇的序列化標準格式會以 JSON 為主:JSON (JavaScript Object Notation) 是一種輕量級的數據交換格式,易於閱讀和編寫,而且可以直接在 Web 頁面中讀取,非常方便。

二. 序列化 (serializing)

1. 使用 Flask 內建 jsonify 函式進行序列化 (serializing)

This function wraps dumps() to add a few enhancements that make life easier. It turns the JSON output into a Response object with the application/json mimetype.

API — Flask Documentation (1.1.x)

Flask 內建的 jsonify 包裝了 Python 內建的 json.dumps 的用法,可以輕鬆將 Python 對象 (例如:字典 dict 或列表 list) 轉換成 JSON-formatted string,並且還會幫你在 Http response 的 header 中加入 content-type = application/json。

▍補充常見的 content-type 如下:

application/json : JSON數據格式
application/pdf :pdf 格式
application/msword : Word 文檔格式
application/x-www-form-urlencoded : 表單默認的提交數據的格式
multipart/form-data : 進行文檔上傳時,需要使用的該格式
筆記 Postman 常見的 Content-type – hobo engineer – Medium

使用 Flask 內建的 jsonify 實作序列化 (serializing) 範例如下:

from flask import Flask, jsonify 

app = Flask(__name__) 

@app.route('/', methods=['GET']) 
def index(): 
    response = jsonify({'msg': 'welcome'}) 
    return response 

2. 使用 Python 內建的 json.dumps 實作序列化 (serializing)

Serialize obj to a JSON-formatted string
API — Flask Documentation (1.1.x)
json — JSON encoder and decoder — Python 3.8.3rc1 documentation

Python 內建的 json.dumps,可以將 Python 對象 (例如:字典 dict 或列表 list) 轉換成 JSON-formatted string,與 Flask jsonify 的差異在於 Http response 時,需自己手動加入 content-type = application/json。

使用 Python 內建的 json.dumps 實作序列化 (serializing) 範例如下:

from flask import Flask,Response 

app = Flask(__name__) 

@app.route('/', methods=['GET']) 
def index(): 
    return Response(json.dumps({'msg': 'welcome'}), mimetype='application/json') 

3. 使用 Flask 擴充套件 Marshmallow 實作序列化 (serializing)

marshmallow is an ORM/ODM/framework-agnostic library for converting complex datatypes, such as objects, to and from native Python datatypes.
marshmallow: simplified object serialization — marshmallow 3.6.0 documentation

▍安裝 marshmallow

$ pip install marshmallow

▍第一步:建立 Schema 欄位
待會將會使用 Schema 來當作轉換規範,而 marshmallow 建立 Schema 有兩種方法

from marshmallow import Schema, fields

# 方法一 defining a class
class UserSchema(Schema):
    name = fields.Str()
    email = fields.Email()
    created_at = fields.DateTime()

# 方法二 from a dictionary 
UserSchema = Schema.from_dict(
    {"name": fields.Str(), "email": fields.Email(), "created_at": fields.DateTime()}
)

▍第二步:使用 Schema 進行序列化
Marshmallow 序列化可使用 schema.dump() 或 schema.dumps():

  1. schema.dump() 方法實現 obj -> dict
  2. schema.dumps() 方法實現 obj -> JSON-formatted string
# 實例化剛剛建立的 Schema
schema = UserSchema()

# 使用 schema.dump() 放入要序列化的數據 user
dict_result = schema.dump(user) # obj -> dict
json_result = schema.dumps(user) # obj -> JSON

print(dict_result)
print(json_result)

三. 反序列化 (deserializing)

1. 使用 Python 內建的 json.loads 實作反序列化 (deserializing)

可以將 JSON-formatted string 轉換成 Python 對象 (例如:字典 dict 或列表 list)
Python JSON | 菜鸟教程

使用 Python 內建的 json.loads 實作序列化 (deserializing) 範例如下:

import json

jsonData = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

text = json.loads(jsonData)

2. 使用 Flask 擴充套件 Marshmallow 實作序反列化 (deserializing)

▍安裝 marshmallow

$ pip install marshmallow

▍第一步:建立 Schema 欄位

實作方式和剛剛一樣都需要先建立 Schema 欄位,而建立 Schema 有兩種方法如下:

from marshmallow import Schema, fields

# 方法一 defining a class
class UserSchema(Schema):
    name = fields.Str()
    email = fields.Email()
    created_at = fields.DateTime()

# 方法二 from a dictionary 
UserSchema = Schema.from_dict(
    {"name": fields.Str(), "email": fields.Email(), "created_at": fields.DateTime()}
)

▍第二步:使用 Schema 進行反序列化

Marshmallow 反序列化可使用 schema.load() 或 schema.loads():
1. schema.load() 方法實現 dict -> obj
2. schema.loads() 方法實現 JSON-formatted string -> obj

# 實例化剛剛建立的 Schema
schema = UserSchema()

# 使用 schema.load() 放入要反序列化的數據 user
dict_result = schema.load(user) # dict -> obj
json_result = schema.loads(user) # JSON -> obj

print(dict_result)
print(json_result)

最後~

▍回顧一下本篇實作 marshmallow 和 jsonify 序列化的重點:

  1. 什麼是序列化和反序列化?
  2. 序列化 (serializing)
    • Flask 內建 jsonify 函式進行序列化
    • Python 內建的 json.dumps 實作序列化
    • Flask 擴充套件 Marshmallow 實作序列化
  3. 反序列化 (deserializing)
    • Python 內建的 json.loads 實作反序列化
    • Flask 擴充套件 Marshmallow 實作序反列化

關於 Flask 教學的延伸閱讀:

▍關於 Flask 教學系列目錄:

▍其他 Flask 相關教學:

那【Flask教學系列】實作 Flask 序列化 和 反序列化 方法 就到這邊,感謝收看,如果有任何問題歡迎留言唷!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *