Qt5 - QWebEngine CORS для собственного типа URI
Итак, основная суть в том, что у меня есть ресурсы javascript, такие как https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js которые я использую в QWebEngine. Предполагается, что программа также работает в автономном режиме, поэтому я создал 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
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('/'))