Вопрос по json, python – Как я могу отправить данные cookie в формате JSON с помощью Python на Google App Engine?

6

Я пытаюсь закодировать объект в скрипте Python и установить его как cookie, чтобы я мог прочитать его с помощью клиентского JavaScript.

Я сталкивался с проблемами каждый раз, когда пытался это сделать. Как правило, файл cookie отформатирован таким образом, что JSON.parse () прерывается.

Мой текущий скрипт:

<code>cookie = Cookie.SimpleCookie()
data = {"name": "Janet", "if_nasty": "Ms. Jackson"}
cookie['test'] = json.dumps(data)
self.response.headers.add_header("Set-Cookie", cookie.output(header=''))
</code>

... что приводит к

<code>test="{\"name\": \"janet\"\054 \"if_nasty\": \"Ms. Jackson\"}"
</code>

на клиенте.

Я действительно не хочу вводить хакерское решение, которое заменяет запятые, когда они появляются. Любые идеи, как я могу передать сложные структуры данных (оба путем установкиand чтение куки) с Python?

Экранирование необходимо для того, чтобы сделать это через заголовки HTTP. Почему имеет значение, в каком формате он хранится на клиенте? Nick Johnson
Я получаю правильное значение, когда читаю значение на стороне сервера. Но когда он хранится на клиенте, он экранируется в странном формате. marclar
Что вы получаете обратно, когда читаете cookie в запросе? Файл cookie должен декодироваться так же, как он был закодирован; если нет, то где-то есть ошибка в библиотеке cookie. Nick Johnson
Ничего себе, передача данных между клиентом и сервером с помощью куки немного ... странно. Чего ты пытаешься достичь? Nick Johnson
Это важно, потому что я хочу декодировать его как объект JSON, используя json2.js или нативную браузерную реализацию JSON.parse (string). Сейчас я взломал его, заменив запятые на "|" персонажи, но я бы предпочел найти более надежное решение. marclar

Ваш Ответ

3   ответа
0

руководство по началу работы для предоставления информации клиенту

0

Python боковая сторона:

json.dumps the string escape spaces - just call .replace(' ', '%20') Call urllib.quote_plus() then write the string to the cookie

JavaScript боковая сторона:

read the cookie pass it through decodeURIComponent() JSON.parse it

Кажется, это самый чистый способ, который я нашел.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
2

клиенте. Я обошел проблему с помощью base64, кодирующей строку JSON, однако с этим подходом связано несколько небольших ошибок.

1: строки Base64 оканчиваются 0-2 знаками равенства, и они были преобразованы в строку \ 075. Мой подход заключается в том, чтобы превратить эти символы в одинаковые символы на клиенте.

2: строка base64 заключена в двойные кавычки в файле cookie. Я удаляю их на клиенте.

Сервер:

nav_json = json.dumps(nav_data)
nav_b64=base64.b64encode(nav_json)
self.response.set_cookie('nav_data', nav_b64)

Клиент:

var user_data_base64= $.cookie('nav_data');
// remove quotes from around the string
user_data_base64 = user_data_base64.replace(/"/g,"");
// replace \075 with =
user_data_base64 = user_data_base64.replace(/\\075/g,"=");
var user_data_encoded=$.base64.decode( user_data_base64 );
var user_data = $.parseJSON(user_data_encoded);

Я использую 2 плагина jquery здесь: https://github.com/carlo/jquery-base64  а также https://github.com/carhartl/jquery-cookie

Примечание: я считаю это хаком: было бы лучше повторно реализовать код Python, который кодирует cookie в javascript, однако у этого также есть и обратная сторона, которую вам необходимо будет заметить, перенести и внести изменения в этот код.

Теперь я перешел к решению, где я использую небольшой HTML-файл, чтобы установить куки на стороне клиента, а затем перенаправить на фактическую запрашиваемую страницу. Вот фрагмент из шаблона JINJA2, который я использую:

<script type="text/javascript">
var nav_data='{% autoescape false %}{{nav_data}}{% endautoescape %}';
$.cookie('nav_data', nav_data, { path: '/' });
window.location.replace("{{next}}")
</script>

Примечание 2: файлы cookie не идеальны для моего случая использования, и я, вероятно, перейду к сеансу или локальному хранилищу, чтобы уменьшить нагрузку на сеть (хотя мои nav_data довольно малы - дюжина символов или около того).

Error: User Rate Limit Exceeded marclar

Похожие вопросы