Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mod_wsgi下从Django运行PyQt QApplication_Django_Pyqt_Pyqt4_Mod Wsgi_Pyside - Fatal编程技术网

在mod_wsgi下从Django运行PyQt QApplication

在mod_wsgi下从Django运行PyQt QApplication,django,pyqt,pyqt4,mod-wsgi,pyside,Django,Pyqt,Pyqt4,Mod Wsgi,Pyside,我正在尝试使用PyQt/PySide从Django应用程序中实现一个屏幕截图渲染器,其中我将直接向QWebPage提供一个HTML字符串,并渲染大型机。我已经测试过了,并且能够将其作为一个独立的python脚本来使用(见下文) 但是,Django/Apache/mod_wsgi服务器挂起,并且在尝试调用QApplication([])时不会响应。(注意:我已经尝试了PyQt和PySide,并得到了相同的结果) 我怀疑wsgi无法启动Qt应用程序的问题 以下是wsgi设置的大致范围: WSGIDa

我正在尝试使用PyQt/PySide从Django应用程序中实现一个屏幕截图渲染器,其中我将直接向QWebPage提供一个HTML字符串,并渲染大型机。我已经测试过了,并且能够将其作为一个独立的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', {})
下面是直接调用的脚本

所以,我的问题是:
QApplication([])
在通过Django中的mod_wsgi进行HTTP请求时为什么会挂起?

您可以尝试添加:

WSGIApplicationGroup %{GLOBAL}

但我怀疑问题在于,由于web应用程序作为特殊的Apache用户运行,没有从您的个人用户环境继承任何内容,因此它对如何与UI会话交互一无所知。

这看起来是朝着正确方向迈出的一步。我没有挂起请求并超时,而是在apache日志中得到一个500错误,错误如下:
mod_wsgi:cannotconnect to X server
。“与UI会话交互”是什么意思?这是一个无头服务器环境,没有真正的GUI。我是否需要让QApplication作为特定用户运行?我将如何实现这一点?为了与X服务器通信,通常存在一个环境变量,它将应用程序定向到它应该与之通信的服务器。也可能有授权信息。这些将不存在。