1

我在 appengine 上使用 webapp2 会话库。在我的应用程序中,cookie 的默认路径是/,但我希望特殊 cookie 仅在/api/.*. 该set_cookie方法不允许指定新 cookie 的配置,只指定 cookie 的名称和后端。在创建 cookie 后,我也没有找到更改路径的方法。

from webapp2_extras import sessions


sessions_store = sessions.get_store(request=self.request)
special_cookie = sessions_store.get_session(name='special_cookie', backend='securecookie')

... # change ``special_cookie`` path ? how?

谢谢!

4

2 回答 2

4

您没有使用 cookie,您使用的是会话数据。那是完全不同的。Cookies 存储在浏览器中,会话存储在服务器中。因为会话的想法是它是横向的,所以您必须手动实现您想到的任何特定于路径的逻辑。

如果您想使用具有特定路径的实际 cookie,这很容易并在 web2py 文档中记录

response.cookies['mycookie'] = 'somevalue'
response.cookies['mycookie']['expires'] = 24 * 3600
response.cookies['mycookie']['path'] = '/'

会话和 cookie 有什么区别?cookie 是存储在浏览器上的单个信息块。例如,如果您想跟踪购物车内容以及字体大小偏好,您可能会存储多个 cookie,如下所示:

  • 购物车:第 1 项、第 2 项、第 3 项
  • FONT_SIZE:12pt
  • 姓名:弗雷德

这些变量中的每一个都将与 cookie一起存储在浏览器中。使用会话,您只需在浏览器中存储一条信息,即 session_id:

  • SESSION_ID:56a3y678

然后在服务器端,您将拥有一个可能如下所示的会话数据库:

| SESSION_ID | KEY           | VALUE
---------------------------------------------------
| 56a3y678   | shopping-cart | Item1,Item2,Item3
| 56a3y678   | font-size     | 12pt
| 56a3y678   | name          | Fred

像这样的服务器端存储信息有很多优点。一方面,您可以存储比浏览器可能允许您更多的信息。此外,由于服务器维护自己的数据库,您可以更安全地信任它;虽然无法信任 is_admin_user 的 cookie,但通常可以信任会话变量。

显然,缺点是您依赖于服务器软件,而不是依赖浏览器来保持一切更新。因此,例如,如果您有 10 个 Web 服务器并且用户在它们之间轮换,它们都必须与同一个会话数据库通信才能正常工作。

于 2012-02-27T23:07:54.530 回答
1

默认情况下SessionStore类使用默认配置选项进行实例化,其中pathforcookie_args设置为'/'

如果您希望您的 cookie 具有不同的路径,例如/api,您将需要创建自己的SessionStore类实例。它可以用覆盖的配置值来实例化。这样您就可以拥有仅对指定路径有效的会话存储。

于 2012-02-27T23:44:25.193 回答