2

因此,基本要点是,我在 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
4

1 回答 1

1

结合Qt WebView——拦截加载JS/CSS库加载本地库

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

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('/'))
于 2018-04-27T13:11:06.303 回答