2017-08-08 81 views
0

我正在开发一个web工具,并且在设置cookie时遇到了一些问题。我曾经在20年前在Perl中做过这件事,并且对于2017年看起来似乎没有一种清晰而干净的方式来处理cookie中的cookie!我认为会一天比一天简单快捷。我已经尝试过使用请求模块手动设置cookie,以及我在堆栈溢出中找到的大量部分代码示例。无论我看,文档都很差,没有完整的工作示例,或者答案很老。在Python cgi中设置浏览器cookie的问题

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

这里是我使用的设置我的cookies代码:

#!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. 只有两个上述三个C值的存储饼干当我检查“在运行上述代码后,在Firefox中显示“Cookies”。
  2. 由于使用打印语句设置cookie并再次发送Content-type,因此我在脚本中登录的页面在顶部显示Content-type: text/html Set-Cookie: score=8.76 Set-Cookie: id=12345 Set-Cookie: page=3 ;。发生这种情况时,我的浏览器中不存储cookie。只有在标题中不是Content-type: text/html时才会存储Cookie。

有没有办法从我的脚本里面设置cookies而不打印Content-type: text/html的另一个副本到浏览器?

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

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

回答

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头中的web页面输出中:

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