Context
У меня есть приложение Flask, которое использует sqlalchemy для запроса базы данных и сериализации полученного объекта sqlalchemy. После рендеринга шаблона я хочу передать сериализованный объект в маршрут /_background_process
, используя функцию обратного вызова jQuery для keyup (см. JQuery и маршрут ниже).
Сериализованный объект передается в функцию обратного вызова через аргумент с именем callbackarg
, используя разделитель jinja2 "{{ ... }}"
. Кавычки требуются, иначе произойдет 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
метода sqlalchemy.ext.serializer
. Подход, описанный в этом стеке потока ссылка , также терпит неудачу из-за элементов, которые не сериализуемы в JSON.
Обобщая вопрос
Есть ли способ десериализации retrievedobj
в маршруте /_background_process
после его сериализации и передачи в виде строки с синтаксисом байтов в функцию обратного вызова? Если нет возможности, пожалуйста, не могли бы вы взвесить вопрос, который я задал 1 ноября ссылка ? Спасибо!
Шаблон jQuery in Flask
<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')
...
Сноска
Это вопрос, отличный от того, который я задал 1 ноября ссылка , потому что, хотя этот вопрос касался передачи объекта типа sqlalchemy
, этот вопрос строго касается передачи сериализованного объекта.