【问题标题】:Qt5 - QWebEngine CORS for own uri typeQt5 - QWebEngine CORS 用于自己的 uri 类型
【发布时间】:2018-09-18 14:06:04
【问题描述】:

所以,基本要点是,我在 QWebEngine 中使用了像 https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js 这样的 JavaScript 资源。目的是,该程序也可以离线工作,所以我制作了一个 QWebEngineUrlRequestInterceptor ,将这些地址更改为我自己的本地处理程序,在这种情况下,目标是 conapp://webresource/jquery.min.js

但是,这会导致以下日志消息:

js: Redirect from 
'https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js' has been 
blocked by CORS policy: Redirect location 
'conapp://webresource/jquery.min.js' has a disallowed scheme for cross-
origin requests.

有没有办法专门允许重定向到 conapp://?

一些相关的代码片段,如果有帮助的话 (PyQt5)

class Interceptor(QWebEngineUrlRequestInterceptor):
    def __init__(self):
        super(Interceptor, self).__init__()
        QWebEngineProfile.defaultProfile().setRequestInterceptor(self)

    def interceptRequest(self, info):
        url = info.requestUrl().toString()
        item = url.split("/")[-1]
        if item in LazyLoader:
            target = QUrl(r"conapp://webresource/{}".format(item))
            info.redirect(target)

class SchemeHandler(QWebEngineUrlSchemeHandler):
    def __init__(self):
        super(SchemeHandler, self).__init__()
        QWebEngineProfile.defaultProfile().settings().setAttribute(6, True)
        QWebEngineProfile.defaultProfile().installUrlSchemeHandler(b'conapp', self)
        self._handlers = {}

    def requestStarted(self, job):
        url = job.requestUrl()
        print("Got request for {}".format(url.toDisplayString()))
        request = url.toString().split("//")[1]

        buf = QBuffer(parent=self)
        buf.open(QIODevice.WriteOnly)
        buf.write(self._handlers[request]().encode("utf-8"))
        buf.seek(0)
        buf.close()
        job.reply(b"text/html", buf)

    def register(self, contentgenerator, contentname):
        self._handlers[contentname] = contentgenerator
        return contentname

【问题讨论】:

  • 不行,因为即使是在同一台机器上运行的其他应用程序也不允许访问。我现在已经实现了我自己的拦截 url 的方式——通过修改 html,这只是一种解决方法。

标签: python pyqt pyqt5 qwebengineview


【解决方案1】:

结合Qt WebView - intercept loading of JS/CSS Libraries to load local ones

使用自定义处理程序允许跨站点访问对我有用

class Handler(http.server.SimpleHTTPRequestHandler):
    DATA_DIR = '/my_data_dir'
    def end_headers (self):
        self.send_header('Access-Control-Allow-Origin', '*')
        super().end_headers()
    def translate_path(self, path):
        return os.path.join(self.DATA_DIR, path.lstrip('/'))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多