我試圖從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請求時被掛起?
這看起來像是朝着正確方向邁出的一步。而不是請求掛起和超時,在apache日誌中出現以下500錯誤:'mod_wsgi:無法連接到X服務器'。 「與你的UI會話交互」是什麼意思?這是一個無頭的服務器環境,沒有真正的GUI。我是否需要讓QApplication以特定用戶身份運行?我將如何去實現這一目標? –
爲了與X服務器通信,通常存在一個環境變量,它將應用程序指向應該與之交談的服務器。也可能有授權信息。這些將不存在。 –