0%

Flask 序列化与反序列化

背景

​ 为什么写这篇话题呢,印象中是有次面试中,面试官问我是否了解 Flask 中的序列化与反序列化。由于自身的客观原因,当时对于该问题只能硬着头皮回答:不太了解乀(ˉεˉ乀) 乀(ˉεˉ乀) 。。。(个人觉得还是:基础知识不扎实)

​ 后来这个问题也一直没去关注。。。此次突然想起来后进行一下记录(同样的地方不要翻车两次┑( ̄。。 ̄)┍ )。

行动

​ 大概先了解了下相关定义:SerializationDeserialization 即序列化和反序列化。Flask中是将对象类型数据转为json即为序列化将json转为对象类型数据即为反序列化

Flask中的序列化和反序列化还是比较简单,下面分别进行下理解。

序列化 jsonify()

​ Flask jsonify()的代码还是很简单, 可以理解在默认情况下,Flask的序列化就是直接使用了 json.dumps(),再通过 Response 对象直接返回了 ╮(╯Д╰)╭ ,核心代码如下:

1
2
3
4
5
6
7
8
9
10
11
# 唯一就是在用法上有点区别, Flask的jsonify会对传入的参数进行取舍,具体逻辑如下
elif len(args) == 1: # single args are passed directly to dumps()
data = args[0]
else:
data = args or kwargs

# 最终将 data 通过 json.dumps() 进行序列化
return current_app.response_class(
dumps(data, indent=indent, separators=separators) + "\n",
mimetype=current_app.config["JSONIFY_MIMETYPE"],
)

看到网上其他人说了一些更深层次的内容, 参考链接参考链接2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 默认情况下用的都是 app.json_encoder, 如果有特殊需求,可以对该encoder进行自定义
if app:
...
kwargs.setdefault(
"cls", bp.json_encoder if bp and bp.json_encoder else app.json_encoder
)
...
else:
...
kwargs.setdefault("cls", JSONEncoder)

# 用户也可以通过对 app.json_encoder 进行二次封装
class JSONEncoder(_json.JSONEncoder):
"""The default Flask JSON encoder. This one extends the default
encoder by also supporting ``datetime``, ``UUID``, ``dataclasses``,
and ``Markup`` objects.

# 通过该对象可以定制化,比如我们要返回给前端的是一个从数据库查询的模型对象。那么就可以通过重写该方法进行定制化。

反序列化 request.get_json()

​ 同样的。。。 Flask的反序列化也挺简单,可以理解在默认情况下, Flask的反序列化就是直接使用了 json.loads(),核心代码如下:

1
2
3
4
5
6
7
8
9
10
11
data = self._get_data_for_json(cache=cache)
try:
rv = self.json_module.loads(data)

# self.json_module.loads()
if isinstance(s, bytes):
# Needed for Python < 3.6
encoding = detect_utf_encoding(s)
s = s.decode(encoding)

return _json.loads(s, **kw)

总结

​ 额。。。本来以为是什么,实际查了下对应的资料后,从比较浅的层次来说, Flask中的序列化以及反序列化实际就是使用的 json库中自带的 dumpsloads 。(也可能是才疏学浅,没有太了解深层次的使用场景😂, 比如: Flask序列化),所以,不要被一些 “名词” 高大上的样子忽悠了,可能实际内容并不复杂,困难的是做出去解决这个问题的决心

------------- 本 文 结 束 感 谢 您 的 阅 读 -------------