【问题标题】:Problems setting browser cookies in Python cgi在 Python cgi 中设置浏览器 cookie 的问题
【发布时间】:2023-03-30 15:54:02
【问题描述】:

我正在开发一个网络工具,但在设置 cookie 时遇到了一些问题。 20 年前我曾经在 Perl 中执行此操作,但我感到震惊的是,在 2017 年似乎没有一种清晰干净的方式来使用 Python 处理 cookie!我认为简单快捷的事情已经花费了一整天。我已经尝试过手动设置 cookie,使用 requests 模块,以及我在 Stack Overflow 上找到的大量部分代码示例。在我所见的任何地方,文档都很差,没有完整的工作示例,或者答案很旧。

我正在用 Python 创建一个 cgi 脚本。在脚本的登录页面上,我有 print "Content-type: text/html\r\n" 以便在网页上显示一个文本框和选择菜单。当用户单击提交时,我有一个验证步骤,如果出现错误,需要在页面上打印一些内容。如果没有错误,我需要脚本来加载一个新页面并设置一个 cookie。

这是我用来设置 cookie 的代码:

    #!C:\Python27\python.exe -u

    import Cookie
    c = Cookie.SimpleCookie()
    c['id'] = '12345'
    c['score'] = '8.76'
    c['page'] = '3'
    print "Content-type: text/html %s;\r\n" % (c)
    print ""
    print c

问题是:

  1. 当我在自行运行上述代码后在 Firefox 中选中“显示 Cookie”时,上面显示的三个 c 值中只有两个存储为 cookie。
  2. 我在脚本中登陆的页面顶部显示Content-type: text/html Set-Cookie: score=8.76 Set-Cookie: id=12345 Set-Cookie: page=3 ;,这是由于使用打印语句设置cookie并再次发送内容类型。发生这种情况时,我的浏览器中不会存储任何 cookie。仅当标头中还没有 Content-type: text/html 时才会存储 Cookie。

有没有办法在我的脚本中设置 cookie 而无需在浏览器中打印另一个 Content-type: text/html 副本?

我还需要一种在用户在工具中四处移动时无缝更新 cookie 的方法。例如,当他们点击下一页时,cookie 会更新为下一页的页码。

我在 Windows 10 上使用 Python 2.7,并使用 Firefox 作为我的测试浏览器。

【问题讨论】:

    标签: python cookies cgi


    【解决方案1】:

    我已经设法解决了这两个问题。

    问题 #1:上面显示的三个 c 值中只有两个存储为 cookie。

    解决方案:我设置了我的 cookie,以便在一个 cookie 中传递三个值。例如:

    import Cookie
    c = Cookie.SimpleCookie()
    c['id'] = '12345|score=8.76|page=3'
    
    # Output the HTTP message containing the cookie BEFORE Content-type text/html!
    print c
    print "Content-type: text/html\r\n"
    

    问题 #2:网页输出中有额外的 Content-type: text/html 标头:

    解决方案:每次服务器响应来自浏览器的 GET 或 POST 事件时,设置 cookie 必须是 http 响应中发生的第一件事。我不得不重新排序脚本中使用的逻辑,以确保始终如此。对于每个 http 响应,在处理 cookie 之前,不会通过 Content-type: text/html 将任何内容打印到浏览器。

    【讨论】:

      猜你喜欢
      • 2014-11-14
      • 2011-08-14
      • 2014-05-07
      • 1970-01-01
      • 1970-01-01
      • 2018-10-26
      • 2014-08-10
      相关资源
      最近更新 更多