2012-08-16 87 views
1

FIXED通過將QApplication移出main(),可以解決此問題。Python-Django和PyQt4的問題

嗨我想實現一個Web服務,執行給定的URL的JavaScript代碼,並返回最終的HTML。我正在使用PyQt4進行JS處理和Django 1.4 web框架。 的問題是:腳本始終工作在命令邀請,但後來當我整合它的Django它在下面執行它警告只能在第一時間,運行Django的本地服務器後,則:

WARNING: QApplication was not created in the main() thread 
QObject::startTimer: QTimer can only be used with threads started with QThread 

和我得到了錯誤的結果。 的問題是,我沒有使用任何線程 ...這裏是我使用的Django(URL配置導致與URL這主要fonction給出)的腳本:

#!/usr/bin/env python 

import sys 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
from PyQt4.QtWebKit import * 
from time import time, sleep 

app = QApplication(sys.argv) 

def wait(app, secs=1): 
    deadline = time() + secs 
    while time() < deadline: 
     sleep(0) 
     app.processEvents() 

def main(url): 
# app = QApplication(sys.argv) 

    web = QWebView() 
    web.load(QUrl(url)) 

    wait(app, 15) 

    return web.page().mainFrame().toHtml().toUtf8() 

你見過這個之前還是試圖做類似的事情?請幫助我的任何信息謝謝

P.S.這是我在這裏的第一篇文章,我希望一切都清楚:)

編輯警告已經沒有了,謝謝羅斯托斯拉夫,但我仍然有銷售問題。

+0

我不得不試圖生成蒙山上的Django QGIS服務器映射同樣惱人的問題。在我的django項目的views.py中創建QApplication與使用QGIS生成地圖的外部python包創建main()而不是創建它。謝謝你的提示 ! – Istopopoki 2015-07-19 18:27:31

+0

乾杯!我希望一切都適合你。 – Saksow 2015-07-20 21:38:18

回答

1

其實你使用線程

Django開發服務器默認使用線程。您可以選配--nothreading參數傳遞到runserver命令,它的目的是通過服務器禁止使用線程:

python ./manage.py runserver --nothreading ... 
+0

謝謝你的快速回答我不知道這一點。 現在警告消失了,但仍然有相同的問題:第一次執行一切順利(完全呈現html),下一次執行部分html並且沒有javascript處理。 (在shell中腳本始終有效) – Saksow 2012-08-16 14:06:49

+0

我現在可以指出的方式是檢查是否在服務器上執行任何緩存。 – 2012-08-16 14:11:22

+0

我不認爲這是一個緩存問題,因爲我沒有使用相同的URL兩次,也無論我首先使用哪個url,響應僅在(重新)啓動django服務器後第一次。我認爲這是一個PyQt問題,我不知道。無論如何謝謝你 – Saksow 2012-08-17 08:05:07