2010-06-08 1 views
6

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

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

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

ответ

6

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

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

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

+0

Этот сценарий (http://bitbucket.org/julian/hatta-mirror/src/tip/hatta_gtkicon.py) очень близок к тому, что я искал. Он также использует wsgiref. – btbytes

1

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

Смежные вопросы