我正在尝试在 Flask 应用程序中为用户会话实例化一个基本模型实例。我对我的类必须是 JSON 可序列化的要求感到措手不及。我认为会话字典只是存储会话信息的任意构造,但听起来它的使用有更多限制,其中之一显然是 JSON 可序列化的值。还有哪些其他约束以及此 JSON 约束的确切目的是什么?对于 Web 应用程序来说,通过 JSON 持久保存其用户会话是一个很难的期望吗?这个要求从何而来/受到启发?
@app.route( '/' , methods=['GET', 'POST'] )
def index():
"""index takes user to the home page of the application.
"""
# Create model instance for this user session
if 'model' not in session :
session['model'] = Model( )
File "C:\Anaconda3\lib\site-packages\flask\json.py", line 83, in default
return _json.JSONEncoder.default(self, o)
File "C:\Anaconda3\lib\json\encoder.py", line 173, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <Model.Model object at 0x000000000770B6D8> is not JSON serializable
只是为了额外的背景,会话对象看起来是一个 LocalProxy 实例,它可能有助于了解事物的设计。
>>> type( session )
<class 'werkzeug.local.LocalProxy'>
好的,Miguel Grinberg 对此有一些很好的评论烧瓶车间 https://youtu.be/DIcpEg77gdE?t=8835在 Pycon 2015 上。对 JSON 支持的需求与此会话数据的持久保存位置有关,即作为客户端上的 cookie。因此,数据必须序列化以弥合服务器和客户端之间的差距。按照他的说法...
所以 Flask 支持这个会话对象,...在任何路由函数中
在处理请求时,您将会话称为字典。
你写的任何内容都会被记住,下次你可以查找它
它会在那里并且是特定于用户的。
如果你有兴趣知道它是如何工作的,这是 Flask 的内部结构,你向这本字典写入的任何内容,Flask 都会放入 cookie 中并
它将发送给客户端。所以这将被存储在客户端的
网页浏览器。它将是一个经过加密签名的 cookie,
确保用户不会篡改它,并且没有
可能发生攻击。您可以看到 cookie 中的内容,但看不到
修改它。默认情况下,Flask 将数据本身写入 cookie 中,并且
该 cookie 会发送给客户端。许多其他框架的用途
默认不同。基本上他们所做的就是将数据写入
服务器中的文件或数据库,然后他们写入一个带有
标识该数据的 id,然后将 id 发送到
曲奇饼。所以 Flask 默认发送 cookie 中的全部数据
无需在服务器中存储任何内容。
因此,在我的特定情况下,为了解决这个问题,我必须实现一个 JSONEncoder 并首先对其进行编码,然后再将其传输到我的会话
<<Model.py>>
class ModelEncoder( JSONEncoder ) :
def default( self , obj ) :
if isinstance( obj , Model ):
return obj.to_json()
# Let the base class default method raise the TypeError
return json.JSONEncoder.default( self , obj )
class Model( JSONEncoder ) :
....
def to_json( self ) :
"""
to_json transforms the Model instance into a JSON string
"""
return jsonpickle.encode( self )
<<FlaskApp.py>>
...
# Create model instance for this user session
if 'model' not in session :
session['model'] = ModelEncoder().encode( Model( ) )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)