Python 将directory数据存储到MySQL数据库
最近需要将python中的dict数据存储到数据库,但是如果这样写:def notifications():
get_sub = json.loads(request.data)
endpoint = get_sub['endpoint']
keys = get_sub['keys']
try:
expirationTime = get_sub['expirationTime']
except KeyError:
expirationTime = ''
web_push_data = WebPushNotification(endpoint=endpoint, expirationTime=expirationTime,
keys=str(keys))
try:
db.session.add(web_push_data)
db.session.commit()
return jsonify({'result': 1})
except Exception as e:
存入数据库的时候,始终会报错,如果这样写:def notifications():
get_sub = json.loads(request.data)
endpoint = get_sub['endpoint']
keys = str(get_sub['keys'])
try:
expirationTime = get_sub['expirationTime']
except KeyError:
expirationTime = ''
web_push_data = WebPushNotification(endpoint=endpoint, expirationTime=expirationTime,
keys=str(keys))
try:
db.session.add(web_push_data)
db.session.commit()
return jsonify({'result': 1})
except Exception as e:
将json数据变成字符串,存入数据库,问题是解决了,但是在读取数据的时候,会出现问题,读取的也是字符串,还要反序列化:for item in get_all:
web_push_id = item[0]
endpoint = item[1]
keys = eval(item[3])
这里使用了eval反序列化,其实这个函数有一定的危险性,如果对存入数据未作校验,存入数据存在恶意代码,将会被执行。所以在使用的时候需要非常小心。
有没有更好的办法,将存入的数据直接是json呢?
代码如下:def notifications():
get_sub = json.loads(request.data)
endpoint = get_sub['endpoint']
keys = json.dumps(get_sub['keys'])
try:
expirationTime = get_sub['expirationTime']
except KeyError:
expirationTime = ''
web_push_data = WebPushNotification(endpoint=endpoint, expirationTime=expirationTime,
keys=str(keys))
try:
db.session.add(web_push_data)
db.session.commit()
return jsonify({'result': 1})
except Exception as e:
这里直接将将 Python 对象编码成 JSON 字符串,就可以存入数据库了。
之后将已编码的 JSON 字符串解码为 Python 对象,具体代码如下:for item in get_all:
web_push_id = item[0]
endpoint = item[1]
keys = json.loads(item[3])
这样就可以避免这个安全隐患了。
参考资料:
黄兵个人博客原创。