How can I send JSON-formatted cookie data using Python on Google App Engine?

前端 未结 3 720
暖寄归人
暖寄归人 2021-01-12 09:47

I\'m trying to encode an object in a Python script and set it as a cookie so I can read it with client-side JavaScript.

I\'ve run into problems every way I\'ve tried

相关标签:
3条回答
  • 2021-01-12 10:24

    I also wanted to read a cookie (that had been set on the server) on the client. I worked around the issue by base64 encoding the JSON String, however there are a few small gotchas involved with this approach as well.

    1: Base64 strings end with 0-2 equal signs, and these were being converted into the string \075. My approach is to revert those characters into equal characters on the client.

    2: The base64 string is being enclosed in double quote characters in the cookie. I remove these on the client.

    Server:

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

    Client:

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

    I am using 2 jquery plugins here: https://github.com/carlo/jquery-base64 and https://github.com/carhartl/jquery-cookie

    Note: I consider this a hack: It would be better to re-implement the python code that encodes the cookie in javascript, however this also has the downside that you would need to notice and port and changes to that code.

    I have now moved to a solution where I use a small html file to set the cookie on the client side and then redirect to the actual page requested. Here is a snippet from the JINJA2 template that I am using:

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

    Note 2: Cookies are not ideal for my use case and I will probably move on to Session or Local Storage to reduce network overhead (although my nav_data is quite small - a dozen characters or so.)

    0 讨论(0)
  • 2021-01-12 10:30

    On the Python side:

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

    On the JavaScript side:

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

    This seems to be the cleanest way I've found.

    0 讨论(0)
  • 2021-01-12 10:32

    not sure a cookie is the best way of doing this? see the getting started guide for info rendering data to the client

    0 讨论(0)
提交回复
热议问题