Как извлечь параметр POSTed на моем HTTP-сервере Python? [Дубликат]

В итоге я получил следующий код:

    public static string DropTrailingZeros(string test)
    {
        if (test.Contains(CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator))
        {
            test = test.TrimEnd('0');
        }

        if (test.EndsWith(CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator))
        {
            test = test.Substring(0,
                test.Length - CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator.Length);
        }

        return test;
    }
29
задан ataylor 21 May 2010 в 17:16
поделиться

5 ответов

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

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

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

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

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

5
ответ дан Wolph 22 August 2018 в 00:14
поделиться

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

2
ответ дан Benno 22 August 2018 в 00:14
поделиться

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

82
ответ дан damio 22 August 2018 в 00:14
поделиться
  • 1
    Следует отметить, что urlparse в Python 2 не обрабатывает кодировки, версия Python 3 поддерживает это. Кроме того, для сохранения правильного порядка parse_qsl следует использовать вместо parse_qs, который возвращает список. – Wolph 1 July 2016 в 08:35
  • 2
    Имя модуля - urllib, а не url, в Python 3.6 – Evan 17 July 2018 в 18:06

Поддержка основных параметров запроса HTTP предоставляется в модуле CGI . Рекомендуемым механизмом обработки данных формы является класс 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...
2
ответ дан gimel 22 August 2018 в 00:14
поделиться
  • 1
    Библиотека CGI не обрабатывает кодировки (например, utf-8), поэтому она менее подходит, чем некоторые другие доступные библиотеки. – Wolph 22 March 2010 в 07:50
  • 2
    Кодирование может быть делегировано файловому 1-му аргументу FieldStorage. – gimel 22 March 2010 в 08:11
  • 3
    Правда, но зачем беспокоиться, когда есть скрипты, которые обрабатывают это для вас, включая улов ошибок? Не нужно изобретать велосипед. – Wolph 22 March 2010 в 15:05

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

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 с надлежащей кодировкой url

8
ответ дан Mike 22 August 2018 в 00:14
поделиться
  • 1
    Я пытался создать базовый сервер, который мог бы обрабатывать запросы на получение и отправку в Python, и только ваши работали для меня при обработке запросов POST. Это было написано 3 года назад, но спасибо! :) – harkirat1892 28 August 2015 в 12:41
  • 2
    Это не будет работать, если запрос POST использует Transfer-Encoding: chunked. см. developer.mozilla.org/en-US/docs/Web/HTTP/Headers/… – Balz Guenat 15 March 2018 в 17:56
  • 3
    @BalzGuenat BaseHTTPServer реализует сервер HTTP 1.0, так как я его понимаю, кодированные кодировки не разрешены – Mike 22 April 2018 в 14:10
Другие вопросы по тегам:

Похожие вопросы: