在Python cgi中设置浏览器cookie的问题

时间:2017-08-08 03:49:23

标签: python cookies cgi

我正在开发一个网络工具,但在设置Cookie方面遇到了一些问题。我曾经在20年前的Perl中做到这一点,并感到震惊的是,2017年似乎没有一种清晰,干净的方式来处理Python的cookie!我认为一整天都很简单快捷。我已尝试使用请求模块手动设置cookie,以及我在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. 由于使用print语句设置cookie并再次发送Content-type,我在脚本中登陆的页面顶部显示Content-type: text/html Set-Cookie: score=8.76 Set-Cookie: id=12345 Set-Cookie: page=3 ;。发生这种情况时,我的浏览器中不会存储任何cookie。 Cookie仅在标题中不是Content-type: text/html时才会存储。
  3. 有没有办法在我的脚本中设置Cookie而不将另一份Content-type: text/html打印到浏览器?

    当用户在工具中移动时,我还需要一种无缝更新cookie的方法。例如,当他们单击下一页时,cookie将更新为下一页编号。

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

1 个答案:

答案 0 :(得分:0)

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

问题#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向浏览器打印任何内容。