我正在开发一个网络工具,但在设置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
问题是:
Content-type: text/html Set-Cookie: score=8.76 Set-Cookie: id=12345 Set-Cookie: page=3 ;
。发生这种情况时,我的浏览器中不会存储任何cookie。 Cookie仅在标题中不是Content-type: text/html
时才会存储。有没有办法在我的脚本中设置Cookie而不将另一份Content-type: text/html
打印到浏览器?
当用户在工具中移动时,我还需要一种无缝更新cookie的方法。例如,当他们单击下一页时,cookie将更新为下一页编号。
我在Windows 10上使用Python 2.7并使用Firefox作为我的测试浏览器。
答案 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
向浏览器打印任何内容。