在Python中将反斜杠添加到我的cookie中

时间:2009-04-02 14:29:22

标签: python

我正在使用Python的SimpleCookie,我遇到了这个问题,我不确定它是否与我的语法或什么有关。此外,这是我的Python类的课堂作业,所以它的目的是教授Python,所以这远不是我在现实世界中这样做的方式。

无论如何,基本上我将信息输入保存在cookie中的表单中。我正在尝试使用输入的新信息附加到上一个cookie。但由于某些原因,在第三次输入数据时,cookie突然变为“\”。我不知道他们来自哪里。

这是我得到的输出类型:

  

“\”\\“\\\\”test:more \\\\“:rttre \\”:more \“:and more”

#!/usr/local/bin/python

import cgi,os,time,Cookie
#error checking
import cgitb
cgitb.enable()

if 'HTTP_COOKIE' in os.environ:
    cookies = os.environ['HTTP_COOKIE']
    cookies = cookies.split('; ')
    for myCookie in cookies:
        myCookie = myCookie.split('=')
        name = myCookie[0]
        value = myCookie[1]
        if name == 'critter' :
            hideMe = value

#import critterClass

#get info from form
form = cgi.FieldStorage()
critterName = form.getvalue('input')
input2 = form.getvalue('input2')
hiddenCookie = form.getvalue('hiddenCookie')
hiddenVar = form.getvalue('hiddenVar')

#make cookie
cookie = Cookie.SimpleCookie()

#set critter Cookie
if critterName is not None:
    cookie['critter'] = critterName
#If already named
else:
    #if action asked, append cookie
    if input2 is not None:
        cookie['critter'] = hideMe+":"+input2
    else:
        cookie['critter'] = "default"

print cookie


print "Content-type: text/html\n\n"



if ((critterName is None) and (input2 is None)):
    print """
    <form name="critter" id="critter" method="post" action="critter.py">
    <label for="name">Name your pet: <input type="text" name="input" id="input" /></label>
    <input type="submit" name="submit" id="submit" value="Submit" />
    </form>
    """
else:
    formTwo ="""
    <form name="critter2" id="critter2" method="post" action="critter.py">
    <label for="name">%s wants to: <input type="text" name="input2" id="input2" /></label>
    <input type="hidden" name="hiddenVar" id="hiddenVar" value="%s" />
    <input type="submit" name="submit" id="submit" value="Submit" />
    </form>
    [name,play,feed,mood,levels,end]
    """
    print formTwo % (critterName,critterName)

if 'HTTP_COOKIE' in os.environ:
    cookies = os.environ['HTTP_COOKIE']
    cookies = cookies.split('; ')
    for myCookie in cookies:
        myCookie = myCookie.split('=')
        name = myCookie[0]
        value = myCookie[1]
        if name == 'critter' :
            print "name"+name
            print "value"+value

6 个答案:

答案 0 :(得分:3)

正如其他人所解释的那样,反斜杠会转义您插入到cookie值中的双引号字符。这里的(隐藏)机制是SimpleCookie类。 BaseCookie.output()方法返回一个适合作为HTTP头发送的字符串表示。它将在双引号字符之前插入转义字符(反斜杠),在反斜杠字符之前插入

print cookie

语句激活BaseCookie.output()

在每次旅行中,你的字符串通过cookie的output()方法,反斜杠乘以(从第一对引号开始)。

>>> c1=Cookie.SimpleCookie()
>>> c1['name']='A:0'
>>> print c1
Set-Cookie: name="A:0"
>>> c1['name']=r'"A:0"'
>>> print c1
Set-Cookie: name="\"A:0\""
>>> c1['name']=r'"\"A:0\""'
>>> print c1
Set-Cookie: name="\"\\\"A:0\\\"\""
>>> 

答案 1 :(得分:2)

我不确定,但它看起来像常规的Python字符串转义。例如,如果您有一个包含反斜杠或双引号的字符串,Python通常会以转义形式打印它,以使打印的字符串成为有效的字符串文字。

以下代码段说明:

>>> a='hell\'s bells, \"my\" \\'
>>> a
'hell\'s bells, "my" \\'
>>> print a
hell's bells, "my" \

不确定这是否相关,也许具有更多领域知识的人可以加入。

答案 2 :(得分:2)

斜杠是通过转义双引号产生的。显然,第一次,你的代码看到了双引号,并通过添加反斜杠来逃避它。然后它读取转义的反斜杠,并通过前缀 - 反斜杠来逃避反斜杠。然后它读取....

调用追加时会出现问题。

答案 3 :(得分:2)

正如其他人已经说过的那样,只要在Cookie的末尾添加“and more”,就会遇到字符串转义问题。

在此之前,将从SimpleCookie返回cookie标头,而不包含引号。 (如果cookie值中没有空格,则不需要包含引号。)

# HTTP cookie header with no spaces in value
Set-Cookie: cookie=value

# HTTP cookie header with spaces in value
Set-Cookie: cookie="value with spaces"

我建议最初使用相同的SimpleCookie类来解析cookie头,这样可以避免手动执行,也可以正确地处理字符串。

cookies = Cookie.SimpleCookie(os.environ.get('HTTP_COOKIE', ''))
print cookies['critter'].value

编辑 :这个空格的整个处理不适用于这个问题(虽然它在某些情况下可能会在你不期待的时候咬你。)但我建议使用SimpleCookie来解析仍然存在。

答案 4 :(得分:1)

反斜杠用于在字符串中“转义”字符,否则这些字符具有特殊含义,实际上剥夺了它们的特殊含义。经典案例是您可以在引用字符串中包含引号的方式,例如:

Bob said "Hey!"

可以用这种方式写成字符串:

"Bob said \"Hey!\""

当然,你可能希望在那里有一个常规的反斜杠,所以“\”只是意味着一个反斜杠。

编辑:为了回应您对其他答案的评论(关于使用正则表达式删除斜杠),我认为您正在选择错误的结尾。斜杠不是问题,它们是一种症状。问题是你正在对表示引用字符串的字符串进行往返,就好像它们是普通的旧字符串一样。想象一下,两个朋友Bob和Sam进行了一次对话:

Bob:  Hey!
Sam:  Did you say "Hey!"?
Bob:  Did you say "Did you say \"Hey!\"?"?

这就是为什么直到第三次才出现。

答案 5 :(得分:1)

其他人已经指出,这是引号和反斜杠的反斜杠转义的结果。我只是想指出,如果你仔细看看你引用的输出结构,你可以看到这里是如何构建结构的。

您从SimpleCookie获取的Cookie值包含在引号中 - (未经处理的)Cookie具有,例如<​​/ p>

`'[...], critter="value1", [...]'`

', ''='上拆分后,您的字符串包含"value1"。然后,为该字符串附加一个新值,以便该字符串包含"value1":value2

下一次,你得到那个字符串,但是用另一组引号包装它 - 概念上,""value1":value2"。但是为了使网页浏览器在开头不会看到两个引号字符并且认为存在完整的内容,内部引号集将被转义,因此它实际上返回为"\"value1\":value2"

然后你追加另一个块,在服务器和客户端之间来回传递另一个传递,下一次(因为那些反斜杠现在也需要转义)你得到"\"\\"value1\\":value2\":value3"。等等。

正如已经指出的那样,正确的解决方案是让SimpleCookie进行解析而不是自己砍掉字符串。

相关问题