如何反序列化已使用字节语法转换为字符串类型的对象

时间:2018-11-17 20:50:14

标签: python jquery flask sqlalchemy deserialization

上下文

我有一个Flask应用,该应用使用sqlalchemy查询数据库并序列化生成的sqlalchemy对象。呈现模板后,我想使用keyup上的jQuery回调函数将序列化的对象传递到/_background_process路由(请参见下面的jQuery和路由)。

使用jinja2 callbackarg分隔符通过名为"{{ ... }}"的参数在回调函数中传递序列化的对象。引号是必需的,否则会发生SyntaxError,因为serializedobj是一个字节对象,其中包含无效标记,例如&(例如b'\x80\x04\x95...中的

我被困在哪里

当通过request.args.get('callbackarg')路由中的/_background_process检索序列化对象时,该对象是具有字节语法的字符串类型(与字节类型相对),并且已失去了解码属性。这是一个问题,因为参数必须是一个字节对象,才能使用loads

sqlalchemy.ext.serializer方法反序列化

我尝试过的一些事情

我尝试使用其他序列化程序库。 flask.jsonifyjson.dumps均失败,因为sqlalchemy对象中的一个子对象“不可JSON序列化”。 pickle.dumpsdumps的{​​{1}}方法产生相同的结果。由于无法进行JSON序列化的元素,在此stackoverflow link中描述的方法也失败了。

总结问题

在将sqlalchemy.ext.serializer路由序列化并在回调函数中作为带有字节语法的字符串传递后,是否有办法在retrievedobj路由中反序列化/_background_process?如果没有办法,请您谈谈我在11月1日link提出的相关问题吗?谢谢!

Flask模板中的jQuery

<script type=application/javascript>
$(function() {
    $('#process_input').on('keyup', function() {
    $.getJSON('/_background_process', {
        userinput: $('input[name="userinput"]').val(),
        callbackarg: {{ serializedobj }}
    }, function(data) {
        $("#result").text(data.result);
    });
    return false;
    });
});

应用路由

@app.route('/_background_process')
def _background_process():
    retrievedobj = request.args.get('callbackarg')
    ...

脚注 这是与我11月1日link提出的问题不同的问题,因为尽管该问题与传递sqlalchemy类型的对象有关,但该问题严格来说与传递序列化的对象有关。

0 个答案:

没有答案