Добавляется обратная косая черта в мой файл cookie в Python - PullRequest
7 голосов
/ 02 апреля 2009

Я работаю с SimpleCookie Python и столкнулся с этой проблемой, и я не уверен, что это что-то с моим синтаксисом или как. Кроме того, это классная работа для моего класса Python, поэтому она предназначена для обучения Python, так что это далеко не так, как я бы делал это в реальном мире.

Во всяком случае, поэтому в основном я сохраняю ввод информации в форме в куки. Я пытаюсь добавить к предыдущему куки-файлу новую введенную информацию. Но по какой-то причине при третьем вводе данных 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 ]

3 голосов
/ 02 апреля 2009

Как объяснили другие, обратные слэши экранируются двойными кавычками, которые вы вставляете в значение cookie. (Скрытый) механизм в действии - это класс SimpleCookie. Метод BaseCookie.output() возвращает строковое представление, пригодное для отправки в качестве заголовков HTTP. Он вставит escape-символы (обратные слэши) перед символами двойной кавычки и перед символами обратной косой черты .

The

print cookie

оператор активирует BaseCookie.output().

В каждой поездке, которую ваша строка совершает с помощью метода cookie output(), обратные слеши умножаются (начиная с 1-й пары кавычек).

>>> 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\\\"\""
>>> 
2 голосов
/ 03 апреля 2009

Как уже говорили другие, у вас возникают проблемы с выходом строки, как только вы добавляете "и больше" в конец файла cookie.

До этого момента заголовок cookie возвращается из SimpleCookie без кавычек. (Если в значении 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

edit : Вся эта сделка с пробелами не относится к этому вопросу (хотя в определенных обстоятельствах она может прийти и укусить вас, когда вы этого не ожидаете). предложение использовать SimpleCookie для разбора до сих пор остается в силе.

2 голосов
/ 02 апреля 2009

Косая черта является результатом выхода из двойных кавычек. По-видимому, в первый раз ваш код видит двойную кавычку и избегает ее, добавляя обратную косую черту. Затем он читает экранированный обратный слеш и экранирует обратный слеш, добавляя перед ним обратный слеш. Тогда это читает ....

Проблема возникает при вызове append.

2 голосов
/ 02 апреля 2009

Я не уверен, но это похоже на экранирование обычной строки Python. Например, если у вас есть строка, содержащая обратную косую черту или двойные кавычки, Python будет часто печатать ее в экранированном виде, чтобы сделать напечатанную строку допустимым строковым литералом.

Следующий фрагмент иллюстрирует:

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

Не уверен, что это уместно, возможно, кто-то с большим знанием предметной области может вмешаться.

1 голос
/ 03 апреля 2009

Другие уже указывали, что это результат обратной косой черты в кавычках и обратной косой черты. Я просто хотел указать, что если вы внимательно посмотрите на структуру цитируемой продукции, вы увидите, как эта структура строится здесь.

Значение cookie, которое вы получаете от SimpleCookie, заключено в кавычки - (необработанный) cookie имеет, например,

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

После разделения на ', ' и '=' у вас есть строка, содержащая "value1". Затем вы добавляете новое значение к этой строке, чтобы строка содержала "value1":value2.

В следующий раз вы получите эту строку обратно, но с другим набором кавычек, обертывающих ее - концептуально ""value1":value2". Но чтобы сделать так, чтобы веб-браузер не видел в начале двух символов кавычек и думал, что это все, что есть, внутренний набор кавычек экранируется, поэтому он фактически возвращается как "\"value1\":value2".

Затем вы добавляете еще один фрагмент, делаете еще один проход назад и вперед между сервером и клиентом, и в следующий раз (поскольку эти обратные слеши тоже нужно экранировать) вы получите "\"\\"value1\\":value2\":value3". И так далее.

Правильное решение, как уже указывалось, состоит в том, чтобы позволить SimpleCookie выполнять разбор вместо того, чтобы разбивать строки самостоятельно.

1 голос
/ 02 апреля 2009

Обратная косая черта используется для «экранирования» символов в строках, которые в противном случае имели бы особое значение, фактически лишая их особого значения. Классический случай - это способ включения кавычек в строки в кавычках, например:

Bob said "Hey!"

, который можно записать в виде строки следующим образом:

"Bob said \"Hey!\""

Конечно, вы можете захотеть использовать обычную обратную косую черту, поэтому «\» означает только одну обратную косую черту.

РЕДАКТИРОВАТЬ: В ответ на ваш комментарий к другому ответу (об использовании регулярного выражения для удаления косой черты) я думаю, что вы берете не тот конец палки. Косые черты не проблема, они - симптом. Проблема в том, что вы выполняете обходы, обрабатывая строки, представляющие строки в кавычках, как если бы они были обычными старыми строками. Представьте себе двух друзей, Боба и Сэма, разговаривающих:

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

Вот почему они не появляются до третьего раза.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...