PyQt/PySide を使用して Django アプリケーション内からスクリーンショット レンダラーを実装しようとしています。そこでは、HTML の文字列を QWebPage に直接フィードし、mainFrame をレンダリングします。テストしたところ、これをスタンドアロンの Python スクリプトとして機能させることができました (以下)。
ただし、Django/Apache/mod_wsgi サーバーがハングし、 を呼び出そうとしても応答しませんQApplication([])。(注: PyQt と PySide の両方を試しましたが、どちらでも同じ結果が得られました)。
wsgi が Qt アプリケーションを起動できないという問題があると思われます。
wsgi セットアップの範囲は、多かれ少なかれ次のとおりです。
WSGIDaemonProcess site processes=2 threads=4 maximum-requests=10 inactivity-timeout=0.5
WSGIProcessGroup site
WSGIPassAuthorization On
WSGIScriptAlias / /etc/apache2/site.wsgi
Django アプリケーションのビュー ファイルは次のとおりです。
from __future__ import unicode_literals, division
import sys
from PySide import QtWebKit
from PySide.QtNetwork import (
    QNetworkRequest, QNetworkAccessManager, QNetworkCookieJar,
    QNetworkDiskCache, QNetworkProxy, QNetworkCookie)
from PySide import QtCore
from PySide.QtCore import (
    QSize, QByteArray, QUrl, QDateTime, QtCriticalMsg, QtDebugMsg, QtFatalMsg,
    QtWarningMsg, qInstallMsgHandler)
from PySide.QtGui import QApplication, QImage, QPainter, QPrinter
from django.views.generic.base import View
from django.core.urlresolvers import resolve
from app.views.common import *
log = logging.getLogger(__name__)
class Renderer(QtWebKit.QWebPage):
    def __init__(self, html):
        log.debug('getting application')
        """
            This is where the application hangs!!!!
        """
        self.app = QApplication(sys.argv)
        log.debug('app %s', self.app)
        super(QtWebKit.QWebPage, self).__init__()
        self.url = QUrl(url)
        self.mainFrame().setHtml(html)
        self.loadFinished.connect(self.render)
        self.app.exec_()
    def render(self, result):
        self.frame = self.mainFrame()
        self.app.quit()
class StaticImageView(View):
    def get(self, request):
        view_func, args, kwargs = resolve(request.GET.get('path'))
        html = view_func(self.request, *args, **kwargs)
        r = Renderer(html)
        size = QSize(1200, 800)
        r.setViewportSize(size)
        image = QImage(size, QImage.Format_ARGB32_Premultiplied)
        painter = QPainter(image)
        r.frame.render(painter)
        painter.end()
        image.save('/tmp/foo.png')
        return render(request, 'pages/success.html', {})
そして、以下は直接呼び出されたときに動作するスクリプトです。https://gist.github.com/paularmstrong/7472484
QApplication([])だから、私の質問は: Django で mod_wsgi を介して HTTP 要求中に呼び出されるとハングするのはなぜですか?