上下文
我有一个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.jsonify
和json.dumps
均失败,因为sqlalchemy对象中的一个子对象“不可JSON序列化”。 pickle.dumps
与dumps
的{{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
类型的对象有关,但该问题严格来说与传递序列化的对象有关。