文章内容

2020/7/29 10:10:53,作 者: 黄兵

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])

这样就可以避免这个安全隐患了。


参考资料:

1、Python JSON

2、How to store python dictionary in to mysql DB through python


黄兵个人博客原创。

转载请注明出处:黄兵个人博客 - Python 将directory数据存储到MySQL数据库

分享到:

发表评论

评论列表