Каков стандарт для «application/x-www-form-urlencoded» и пустого значения?

Некоторое время назад я заметил, что при кодировании карты name: value в 'application/x-www-form-urlencoded она отображает что-то вроде этого (здесь я использую Python):

>>> from urllib import urlencode
>>> urlencode({'hello': '', 'blabla': 'hihi'})
'blabla=hihi&hello='

Но синтаксический анализ (по крайней мере, с Python) просто удаляет пары, которые имеют пустое значение:

>>> from urlparse import parse_qs
>>> parse_qs('blabla=hihi&hello=')
{'blabla': ['hihi']}

Итак... это стандартное поведение? Где я могу найти ссылку на то, как следует анализировать www-form-urlencoded? Я некоторое время гуглил, нашел RFC для uris, документы W3c для форм и так далее, но ничего о том, как следует обрабатывать пустые значения. Может ли кто-нибудь дать мне указатель на это???


person sebpiq    schedule 08.03.2011    source источник


Ответы (1)


Насколько я знаю, для этого нет "стандарта". Единственное, что описано (в спецификации html, как вы выяснили), это то, как браузер должен кодировать данные формы. Что вы хотите делать (или нет) с пустыми значениями, зависит от вас.

Обратите внимание, что urlparse.parse_qs() имеет необязательный параметр keep_blank_values, который позволяет вам контролировать, как он должен обрабатывать их:

>>> from urlparse import parse_qs
>>> parse_qs('blabla=hihi&hello=', keep_blank_values=True)
{'blabla': ['hihi'], 'hello': ['']}
person Steven    schedule 08.03.2011
comment
Спасибо за ответ !! Я не знал этого kwarg keep_blank_values. Вы случайно не знаете, есть ли в Django настройка для этого? - person sebpiq; 08.03.2011
comment
Разве Django уже не делает это для request.GET и request.POST? - person Steven; 08.03.2011
comment
@Стивен: ну ... я так не думаю, но я могу ошибаться ... хотя я почти уверен, что это не так - person sebpiq; 08.03.2011
comment
Я сам не использую django, поэтому я не уверен, но эти вопросы SO, похоже, указывают на то, что это так: stackoverflow .com/questions/3500859/django-request-get и stackoverflow.com/questions/2422055/ - person Steven; 08.03.2011
comment
@Steven: Хорошо ... моя ошибка, ты был прав, я также проверил с Django, и действительно, параметры не удалены. Однако то, с чего я начал, заключается в том, что с «выбрать несколько», если ничего не выбрано, параметр не отправляется. Однако это проблема клиента, а не сервера. - person sebpiq; 09.03.2011
comment
Я разместил новый вопрос (на самом деле настоящий вопрос для меня) здесь: stackoverflow.com/questions/5242944/ - person sebpiq; 09.03.2011