【问题标题】:How can I send JSON-formatted cookie data using Python on Google App Engine?如何在 Google App Engine 上使用 Python 发送 JSON 格式的 cookie 数据?
【发布时间】:2012-04-30 11:12:48
【问题描述】:

我正在尝试在 Python 脚本中编码一个对象并将其设置为 cookie,以便我可以使用客户端 JavaScript 读取它。

我尝试这样做的每一种方式都遇到了问题。通常,cookie 的格式会导致 JSON.parse() 中断。

我当前的脚本:

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

...导致

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

在客户端。

我真的不想引入一个 hack-y 解决方案来替换出现的逗号实例。任何想法如何使用 Python 传递复杂的数据结构(通过设置 读取 cookie)?

【问题讨论】:

  • 在读取请求中的 cookie 时,究竟会得到什么? cookie 应该以与其编码相同的方式进行解码;如果没有,则 cookie 库中的某个地方存在错误。
  • 当我在服务器端读取值时,我得到了正确的值。但是当它存储在客户端时,它会以一种奇怪的格式进行转义。
  • 转义是它通过 HTTP 标头所必需的。为什么它在客户端上存储的格式很重要?
  • 这很重要,因为我想使用 json2.js 或 JSON.parse(string) 的本机浏览器实现将其解码为 JSON 对象。现在我通过用“|”替换逗号来解决它字符,但我更愿意找到一个更强大的解决方案。
  • 哇,使用 cookie 在客户端和服务器之间传递数据有点……奇怪。你想达到什么目的?

标签: python json google-app-engine webapp2


【解决方案1】:

Python 方面:

  1. json.dumps字符串
  2. 转义空间 - 只需拨打.replace(' ', '%20')
  3. 调用urllib.parse.quote_plus()然后将字符串写入cookie

JavaScript 方面:

  1. 读取 cookie
  2. 通过decodeURIComponent()
  3. JSON.parse

这似乎是我找到的最干净的方式。

【讨论】:

  • 删除空格可能会改变 cookie 的值。例如{1:“你好,世界!”} -> {1:“你好,世界!”}
  • 这太老了,但你是对的,我的回答有一个小错误,现在已经更正了。 (转义空格,而不是替换)
  • 这应该是公认的答案,它更简单,警告更少。此外,如果您知道 json 数据的值中没有空格,则可以使用 json.dumps(nav_data, separators=(',', ':'),然后您不需要转义空格。
【解决方案2】:

我还想在客户端读取一个 cookie(已在服务器上设置)。我通过 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-base64https://github.com/carhartl/jquery-cookie

注意:我认为这是一个 hack:最好重新实现在 javascript 中编码 cookie 的 python 代码,但这也有缺点,您需要注意并移植和更改该代码。

我现在已经转移到一个解决方案,我使用一个小的 html 文件在客户端设置 cookie,然后重定向到请求的实际页面。这是我正在使用的 JINJA2 模板中的一个 sn-p:

<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 非常小 - 十几个字符。)

【讨论】:

  • 啊——非常聪明(而且答案很好;谢谢)。我目前只是用“|”替换逗号然后稍后恢复逗号,因为逗号似乎导致了问题。它也很hacky,但现在就足够了。不过,我认为您的方法可能是一种更好的长期破解方法;)
【解决方案3】:

不确定 cookie 是不是最好的方法?请参阅getting started guide 获取向客户端呈现数据的信息

【讨论】:

    猜你喜欢
    • 2013-09-14
    • 1970-01-01
    • 2012-11-14
    • 2011-05-31
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多