Подтвердить что ты не робот

Разбирайте параметры http GET и POST из BaseHTTPHandler?

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 = {}

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

>>> from url.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.

Ответ 3

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

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

Это приведет к удалению urlencoded POST-данных из содержимого документа и разбора его dict с правильным urldecoding

Ответ 4

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

Ответ 5

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

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

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

Например, следующий код (который предполагает, что заголовок Content-Type и пустая строка уже были напечатаны) проверяет, что имена полей и 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...