¿Cómo puedo enviar datos de cookies con formato JSON usando Python en Google App Engine?

Estoy tratando de codificar un objeto en un script de Python y configurarlo como una cookie para poder leerlo con JavaScript del lado del cliente.

Me he encontrado con problemas en todos los sentidos que he tratado de hacer esto. En general, la cookie se formatea de manera que se rompe JSON.parse ().

Mi guión actual:

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='')) 

… lo que resulta en

 test="{\"name\": \"janet\"\054 \"if_nasty\": \"Ms. Jackson\"}" 

en el cliente.

Realmente no quiero presentar una solución de hack-y para reemplazar instancias de comas cuando aparecen. ¿Alguna idea de cómo puedo pasar estructuras de datos complejas (tanto configurando como leyendo cookies) con Python?

También quería leer una cookie (que se había establecido en el servidor) en el cliente. Resolví el problema con base64 codificando la cadena JSON, sin embargo, también hay algunos pequeños errores involucrados con este enfoque.

1: las cadenas Base64 terminan con 0-2 signos iguales, y se convirtieron en la cadena \ 075. Mi enfoque es revertir esos caracteres en caracteres iguales en el cliente.

2: La cadena base64 se incluye entre comillas dobles en la cookie. Los quito en el cliente.

Servidor:

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

Cliente:

 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); 

Estoy usando 2 complementos de jquery aquí: https://github.com/carlo/jquery-base64 y https://github.com/carhartl/jquery-cookie

Nota: Considero que esto es un truco: sería mejor volver a implementar el código de Python que codifica la cookie en JavaScript, sin embargo, esto también tiene la desventaja de que debería tener en cuenta y el puerto y los cambios en ese código.

Ahora me he mudado a una solución en la que utilizo un pequeño archivo html para configurar la cookie en el lado del cliente y luego redirigir a la página real solicitada. Aquí hay un fragmento de la plantilla JINJA2 que estoy usando:

  

Nota 2: las cookies no son ideales para mi caso de uso y probablemente pasaré a la sesión o al almacenamiento local para reducir la sobrecarga de la red (aunque mis datos de navegación son bastante pequeños, aproximadamente una docena de caracteres).

¿No estás seguro de que una cookie es la mejor manera de hacer esto? Consulte la guía de inicio para obtener información sobre el procesamiento de datos al cliente.

En el lado de Python :

  1. json.dumps la cadena
  2. espacios de escape: simplemente llame a .replace(' ', '%20')
  3. Llame a urllib.quote_plus() luego escriba la cadena en la cookie

En el lado de JavaScript :

  1. lee la galleta
  2. decodeURIComponent() por decodeURIComponent()
  3. JSON.parse .

Esta parece ser la forma más limpia que he encontrado.