Как десериализовать объект, который был преобразован в строковый тип с байтовым синтаксисом - PullRequest
0 голосов
/ 17 ноября 2018

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, этот вопрос строго касается передачи сериализованного объекта.

...