Каков рекомендуемый способ запуска встроенного веб-сервера в настольном приложении (скажем, wsgi-сервер с pyqt)

Настольное приложение должно запускать веб-сервер при запуске и закрывать его при закрытии.

Предполагая, что рабочий стол - единственный клиент, которому разрешено подключаться к веб-серверу, как лучше написать это?

И веб-сервер, и рабочий стол работают по своему усмотрению. Итак, я должен использовать потоки или многопроцессорность?

3 ответа

Решение

Используйте что-то вроде CherryPy или paste.httpserver. Вы можете использовать сервер wsgiref, и он обычно работает нормально локально, но если вы используете Ajax, однопоточная природа wsgiref может привести к некоторым странным результатам, или если вы когда-либо сделаете подзапрос, вы получите условие гонки. Но в большинстве случаев это будет хорошо. Для вас может быть полезно не иметь встроенный многопоточный сервер (и CherryPy, и paste.httpserver являются многопоточными), и в этом случае wsgiref будет полезен (все запросы будут выполняться из одного потока).

Обратите внимание, что если вы используете CherryPy или paste.httpserver, все запросы будут автоматически выполняться в подпотоках (эти пакеты создают поток для вас), и вы, вероятно, не сможете напрямую касаться кода GUI из вашего веб-кода (так как код GUI обычно не любит, когда его обрабатывают темы). Для любого из них код сервера блокируется, поэтому вам нужно создать поток, чтобы запустить сервер. Twisted может работать в вашем обычном цикле обработки событий GUI, но, если это не важно, это добавляет много сложности.

Не используйте BaseHTTPServer или SimpleHTTPServer, они глупы и сложны, и во всех случаях, когда вы можете их использовать, вам следует вместо этого использовать wsgiref. Каждый случай, как у wsgiref, имеет вменяемый API (WSGI), в то время как у этих серверов есть глупые API.

Посмотрите на пакет BaseHTTPServer или, что еще лучше, SimpleHTTPServer. Довольно простой и удобный в использовании.

В Sauce RC мы используем CherryPy. Поскольку это чистый Python, его очень легко встроить (как исходный текст на диск или в zip-файл).

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