【问题标题】:Getting error while trying to add header with Set-Cookie in GAE尝试在 GAE 中使用 Set-Cookie 添加标头时出错
【发布时间】:2011-07-22 15:25:21
【问题描述】:

我正在尝试在我的项目中包含外部 python 模块以处理会话。它被命名为gmemsess.py。它尝试在响应中添加 Set-Cookie 标头并出现错误:

rh.response.headers.add_header('Set-Cookie','%s=%s; path=/;'%(name,self._sid))
AttributeError: HeaderDict instance has no attribute 'add_header'

我阅读了文档,一切似乎都很好,但它不起作用。为什么会出现这个错误? 另外,我使用 webapp2 来管理子域。会不会因此而出现问题?

【问题讨论】:

    标签: python google-app-engine session webapp2


    【解决方案1】:

    headers.add_header 方法在您使用普通 AppEngine 时绝对可以工作,但我猜您使用的是一个框架——其中有很多,比如 Bottle——使用自定义替换 webob's Response对象。

    在 Google 上的一些时间表明,至少有一个名为 HeaderDict 的可识别类扩展了 MultiDict,我认为这就是您正在处理的问题。在这种情况下,您应该进入gmemsess.py 并更改行

    rh.response.headers.add_header('Set-Cookie','%s=%s; path=/;'%(name,self._sid))
    

    阅读

    rh.response.headers['Set-Cookie'] = '%s=%s; path=/;'%(name,self._sid)
    

    这应该可以解决你的问题。

    【讨论】:

    • 是的,你完全正确,已经这样做了,而且效果很好,谢谢!
    • 出现这个问题后,我将 add_header(和其他几个 wsgiref.headers.Headers 方法)包含到 webapp2.Response 中。此处描述了相关问题:code.google.com/p/webapp-improved/issues/detail?id=6
    【解决方案2】:

    忽略 -- 见下面的 cmets

    该模块是为与 App Engine 一起工作而编写的吗? App Engine 使用的响应对象没有add_header 方法,请参阅the docs

    相反,有一个类似dict的对象headers,您可以将值分配给like

    response.headers['Set-Cookie'] = "whatever your cookie value is"
    

    【讨论】:

    • 嗯,作者说他专门为 GAE 创建了那个模块。这是模块的项目页面:code.google.com/p/gmemsess.
    • Duh -- 我没有一直遵循这条链,docs.python.org/library/wsgiref.html#module-wsgiref.headers 说应该有一个 add_header 方法,但是你的回溯说你正在使用 HeaderDict对象,而不是 wsgiref headers 对象。无视我的回答。
    • 你是如何创建会话对象的?您可以发布您正在使用的get() 请求处理程序吗?
    • 我尝试更新包含 add_header 方法的字符串,以便它们使用 dicts 代替。有2个这样的字符串。现在似乎工作正常。但我不确定我是否按照作者希望的方式正确地做到了。
    • 您应该能够从您的 get() 处理程序中将 self 传递给 Session() 构造函数,并且事情应该可以正常工作。
    猜你喜欢
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 2015-09-11
    • 2019-09-08
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    相关资源
    最近更新 更多