2013-11-14 58 views
0

我試圖從Django應用程序中使用PyQt/PySide實現一個截圖渲染器,在這個應用程序中,我將直接將一個HTML字符串提供給QWebPage並呈現mainFrame。我已經測試過,並能夠將其作爲獨立的Python腳本運行(見下文)。從mod_wsgi下運行Django的PyQt QApplication

然而,Django的/阿帕奇/ 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請求時被掛起?

回答

1

你可以嘗試添加:

WSGIApplicationGroup %{GLOBAL} 

但我懷疑的問題是,由於網絡應用程序作爲特殊Apache用戶,而無需從您的個人用戶環境繼承任何東西,因此它不知道如何與互動你的UI會話。

+0

這看起來像是朝着正確方向邁出的一步。而不是請求掛起和超時,在apache日誌中出現以下500錯誤:'mod_wsgi:無法連接到X服務器'。 「與你的UI會話交互」是什麼意思?這是一個無頭的服務器環境,沒有真正的GUI。我是否需要讓QApplication以特定用戶身份運行?我將如何去實現這一目標? –

+0

爲了與X服務器通信,通常存在一個環境變量,它將應用程序指向應該與之交談的服務器。也可能有授權信息。這些將不存在。 –