Разобрать http GET и POST параметры из BaseHTTPHandler? - PullRequest
32 голосов
/ 22 марта 2010

BaseHTTPHandler из модуля BaseHTTPServer, по-видимому, не предоставляет какого-либо удобного способа доступа к параметрам HTTP-запроса. Каков наилучший способ анализа параметров GET из пути и параметров POST из тела запроса?

Прямо сейчас я использую это для GET:

def do_GET(self):
    parsed_path = urlparse.urlparse(self.path)
    try:
        params = dict([p.split('=') for p in parsed_path[4].split('&')])
    except:
        params = {}

Это работает в большинстве случаев, но я бы хотел что-то более надежное, которое правильно обрабатывает кодировки и случаи, например, пустые параметры. В идеале я хотел бы что-то маленькое и автономное, а не полноценный веб-фреймворк.

Ответы [ 5 ]

84 голосов
/ 24 августа 2011

Вы можете использовать urllib.parse:

>>> from urllib.parse import urlparse, parse_qs
>>> url = 'http://example.com/?foo=bar&one=1'
>>> parse_qs(urlparse(url).query)
{'foo': ['bar'], 'one': ['1']}

Для Python 2 , модуль называется urlparseвместо url.parse.

12 голосов
/ 12 июля 2015

Лучшее решение старого вопроса:

def do_POST(self):
    length = int(self.headers.getheader('content-length'))
    field_data = self.rfile.read(length)
    fields = urlparse.parse_qs(field_data)

Это извлечет данные POST в формате Urlen из содержимого документа и проанализирует их с помощью правильного urldecoding

6 голосов
/ 22 марта 2010

Вы можете попробовать модули Werkzeug , базовая библиотека Werkzeug не слишком велика, и при необходимости вы можете просто извлечь этот бит кода, и все готово.

Метод url_decode возвращает MultiDict и имеет поддержку кодирования:)

В отличие от метода urlparse.parse_qs, версия Werkzeug заботится о:

  • кодирование
  • несколько значений
  • порядок сортировки

Если вам это не нужно (или в случае кодирования используйте Python 3), не стесняйтесь использовать встроенные решения.

2 голосов
/ 22 марта 2010

Поддержка основных параметров HTTP-запроса обеспечивается в модуле CGI . Рекомендуемый механизм обработки данных формы - класс cgi.FieldStorage.

Чтобы получить данные отправленной формы, лучше всего использовать класс FieldStorage. Другие классы, определенные в этом модуле, предназначены главным образом для обратной совместимости. Подтвердите это ровно один раз, без аргументов. Это считывает содержимое формы из стандартного ввода или среды (в зависимости от значения различных переменных среды, установленных в соответствии со стандартом CGI). Поскольку он может потреблять стандартный ввод, его следует создавать только один раз.

Экземпляр FieldStorage может быть проиндексирован как словарь Python. Он позволяет проверять членство с помощью оператора in, а также поддерживает стандартный словарный метод keys() и встроенную функцию len(). Поля формы, содержащие пустые строки, игнорируются и не отображаются в словаре; чтобы сохранить такие значения, укажите истинное значение для необязательного параметра ключевого слова keep_blank_values ​​при создании экземпляра FieldStorage.

Например, следующий код (который предполагает, что заголовок Content-Type и пустая строка уже напечатаны) проверяет, что для полей name и addr установлены непустые строки:

form = cgi.FieldStorage()
if "name" not in form or "addr" not in form:
    print "<H1>Error</H1>"
    print "Please fill in the name and addr fields."
    return
print "<p>name:", form["name"].value
print "<p>addr:", form["addr"].value
#...further form processing here...
2 голосов
/ 22 марта 2010

Использовали ли вы такие библиотеки, как CherryPy ? Они обеспечивают гораздо более быстрый путь решения этих проблем, чем BaseHTTPServer.

...