В итоге я получил следующий код:
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;
}
Вы можете попробовать модули Werkzeug , базовая библиотека Werkzeug не слишком велика, и при необходимости вы можете просто извлечь этот бит кода, и все готово.
Метод url_decode
возвращает MultiDict и поддерживает кодировку:)
В отличие от метода urlparse.parse_qs
версия Werkzeug заботится о:
Если вам не нужны эти (или в случае кодирования, используйте Python 3), чем вы можете использовать встроенные решения.
Исследовали ли вы библиотеки, такие как CherryPy ? Они обеспечивают гораздо более быстрый путь к обработке этих вещей, чем BaseHTTPServer.
Вы можете использовать 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
.
parse_qsl
следует использовать вместо parse_qs
, который возвращает список.
– Wolph
1 July 2016 в 08:35
Поддержка основных параметров запроса HTTP предоставляется в модуле CGI
. Рекомендуемым механизмом обработки данных формы является класс cgi.FieldStorage
.
Чтобы получить данные в форме отправки, лучше всего использовать класс
FieldStorage
. Другие классы, определенные в этом модуле, предоставляются в основном для обратной совместимости. Создайте его ровно один раз, без аргументов. Это считывает содержимое формы из стандартного ввода или среды (в зависимости от значения переменных среды, заданных в соответствии со стандартом CGI). Поскольку он может потреблять стандартный ввод, он должен быть создан только один раз.Экземпляр
FieldStorage
может быть проиндексирован как словарь Python. Он позволяет тестировать членство с оператором in, а также поддерживает стандартный метод словаkeys()
и встроенную функциюlen()
. Поля формы, содержащие пустые строки, игнорируются и не отображаются в словаре; чтобы сохранить такие значения, предоставить истинное значение для необязательного параметра ключевого слова keep_blank_values при создании экземпляраFieldStorage
.Например, следующий код (который предполагает, что заголовок Content-Type и пустая строка уже был напечатан) проверяет, что имена полей и addr оба установлены в непустую строку:
blockquote>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...
Лучшее решение старого вопроса:
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
Transfer-Encoding: chunked
. см. developer.mozilla.org/en-US/docs/Web/HTTP/Headers/…
– Balz Guenat
15 March 2018 в 17:56