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

not необходимо поместить реализацию в файл заголовка, см. альтернативное решение в конце этого ответа.

В любом случае причина, по которой ваш код не работает, что при создании экземпляра шаблона компилятор создает новый класс с заданным аргументом шаблона. Например:

template
struct Foo
{
    T bar;
    void doSomething(T param) {/* do stuff using T */}
};

// somewhere in a .cpp
Foo f; 

При чтении этой строки компилятор создаст новый класс (назовем его FooInt), что эквивалентно следующему:

struct FooInt
{
    int bar;
    void doSomething(int param) {/* do stuff using int */}
}

Следовательно, компилятор должен иметь доступ к реализации методов, чтобы создать экземпляр с аргументом шаблона (в данном случае int). Если эти реализации не были в заголовке, они не были бы доступны, поэтому компилятор не смог бы создать экземпляр шаблона.

Общим решением для этого является запись объявления шаблона в заголовок файла, затем реализовать класс в файле реализации (например, .tpp) и включить этот файл реализации в конец заголовка.

// Foo.h
template 
struct Foo
{
    void doSomething(T param);
};

#include "Foo.tpp"

// Foo.tpp
template 
void Foo::doSomething(T param)
{
    //implementation
}

Таким образом, реализация по-прежнему отделена от объявления, но доступен компилятору.

Другое решение состоит в том, чтобы сохранить реализацию отдельно и явно создать все экземпляры шаблона, которые вам понадобятся:

// Foo.h

// no implementation
template  struct Foo { ... };

//----------------------------------------    
// Foo.cpp

// implementation of Foo's methods

// explicit instantiations
template class Foo;
template class Foo;
// You will only be able to use Foo with int or float

Если мое объяснение isn ' t достаточно ясно, вы можете взглянуть на C ++ Super-FAQ по этому вопросу .

34
задан ataylor 21 May 2010 в 16:16
поделиться

3 ответа

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

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

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

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

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

5
ответ дан 27 November 2019 в 06:32
поделиться

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

2
ответ дан 27 November 2019 в 06:32
поделиться

Базовая поддержка параметров 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...
1
ответ дан 27 November 2019 в 06:32
поделиться
Другие вопросы по тегам:

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