【问题标题】:Webkit under Windows with PyQt doesn't get remote resources via xhrWindows下使用PyQt的Webkit无法通过xhr获取远程资源
【发布时间】:2013-02-16 03:09:42
【问题描述】:

我想编写一个 Qt 应用程序,它使用 Webkit 作为它的 gui 从服务器获取数据并显示它。我让它在 Linux 和 OS X 下运行没有问题,但在 Windows 下 XMLHttpRequest 总是返回状态 0,我不知道为什么。这是我使用的pyqt代码:

import sys, os
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *

app = QApplication(sys.argv)
web = QWebView()
web.page().settings().setAttribute(QWebSettings.LocalContentCanAccessRemoteUrls, True)
path = os.path.abspath(os.path.join(os.path.dirname(__file__), 'index.html'))
url = "file://localhost/" + path
web.load(QUrl(url))
web.show()
sys.exit(app.exec_())

这是我用来测试它的html HTML/JS:

<!DOCTYPE html>
<title>TEST</title>
<h1>TEST</h1>
<div id="test"></div>
<script type="text/javascript">
    function t(text) { document.getElementById("test").innerHTML = text }

    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {
        if(this.status != 0)
            t(this.responseText)
        else
            t("Status is 0")
    }
    xhr.open("GET", "https://jeena.net/")
    xhr.send()
</script>

在 Linux 上,它会打开一个包含 WebKit 视图的新窗口,将 html 本地 index.html 文件加载到其中并呈现它,其中显示 TEST 标题。之后,它运行 XMLHttpRequest 代码来获取网站内容并使用 innerHTML 将其设置到准备好的 div 中。

在 Windows 上,它会加载并显示标题,但是当它运行 xhr 代码时,状态始终为 0,并且无论我做什么,它都不会改变。

据我了解LocalContentCanAccessRemoteUrls 应该可以让 xhr 甚至在 Windows 上从远程网站获取该内容,知道为什么这不起作用吗?我在我的 windows 机器和 python v2.7 上使用 Qt 版本 4.9.6。

【问题讨论】:

    标签: windows qt webkit xmlhttprequest pyqt


    【解决方案1】:

    我认为解决这个问题有两种简单的尝试。

    我的第一个想法是这可能是由于跨域请求。 似乎没有简单的方法可以在 QWebkit 中禁用跨域保护。 我从这个 stackoverflow 问题中得到了信息:

    QtWebkit Same-Origin-policy

    如已接受的答案所述:

    “默认情况下,Qt 不公开禁用/白名单同源策略的方法。扩展相同的 (qwebsecurityorigin.cpp) 并使其工作。”

    但既然你已经在 linux 和 mac 上运行了一切,那么上面的可能不是原因。

    另一种可能性是您没有在 Windows 上使用 Qt 启用 openssl。因为我注意到您请求了一个 https 页面,这应该需要 openssl。您可以将页面更改为 http 以快速测试这种可能性。

    【讨论】:

    • 我也猜测 openssl 可能是问题所在。另见stackoverflow.com/questions/3444507/…
    • 是的,确实如此,使用 http 可以正常工作,遗憾的是大多数域都是 https,这个应用程序将使用它。问题是我已经安装了 SSL 并且 QtNetwork.QSslSocket.supportsSsl() 返回 True 但我仍然有同样的问题。
    • 好的,当我忽略这里提出的 ssl 错误 stackoverflow.com/questions/8362506/… 时,一切正常。这是一个真的丑陋的解决方法,但至少应用程序现在显示了数据。我会接受这个答案,因为经过数周的反复试验,它让我走上了正确的道路,非常感谢!如果你们知道解决方法,所以我不需要忽略 ssl 错误,那么我会很高兴听到它。
    • @Jeena 你能显示一些关于 SSL 错误的信息吗?因为它在我的 Windows 机器上无法重现。我正在使用 qt5。
    • 它说:“找不到本地查找证书的颁发者证书。根 CA 证书不被信任用于此目的。”一个示例域是:jeena.tent.is
    猜你喜欢
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 2019-02-15
    • 1970-01-01
    相关资源
    最近更新 更多