Разобрать 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 = {}

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

5 ответов

Решение

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

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

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

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

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

Вы можете использовать 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,

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

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

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

Поддержка основных параметров 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...

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

Другие вопросы по тегам