QWebEngineUrlRequestInterceptor не работает - PullRequest
0 голосов
/ 10 июня 2018

Я мигрирую приложение из PyQt4 в PyQt5.

Я пытаюсь переопределить перехватчик запросов, но по какой-то странной причине это не работает, его не получают.Я использую PyQt == 5.10.0

class WebEngineUrlRequestInterceptor(QWebEngineUrlRequestInterceptor):
    def __init__(self, parent=None):
        super().__init__(parent)

    def interceptRequest(self, info):
        # info.setHttpHeader("X-Frame-Options", "ALLOWALL")
        print("test")
        print(info.requestUrl()) 
class MyWebEnginePage(QWebEnginePage):

    # adblocker = Filter(open('easylist.txt', encoding="utf8"))

    def __init__(self, parent=None):
        super().__init__(parent)

    def acceptNavigationRequest(self, url, _type, isMainFrame):
        # urlString = url.toString()
        # resp = False
        # resp = WebPage.adblocker.match(url.toString())
        #
        # if resp:
        #     print("Blocking url --- "+url.toString())
        #     return False
        # else:
        #     print("TYPE", _type)
        #     return True

         print(url)

         return QWebEnginePage.acceptNavigationRequest(self, url, _type, isMainFrame)

Вот так я загружаю браузер

# init browser
browser = QWebEngineView()
# init profile
profile = QWebEngineProfile()
# add interceptor to profile
interceptor = WebEngineUrlRequestInterceptor()
profile.setRequestInterceptor(interceptor)
# init page setting profile
page = MyWebEnginePage(profile)
page.setUrl(qurl)
browser.setPage(page)

1 Ответ

0 голосов
/ 10 июня 2018

Проблема вызвана тем, что конструктор использует MyWebEnginePage, поскольку вы разместили его с помощью конструктора:

QWebEnginePage :: QWebEnginePage (QObject * parent = Q_NULLPTR)

Создает пустой QWebEnginePage с родительским родителем.

Вместо второго конструктора:

QWebEnginePage :: QWebEnginePage (QWebEngineProfile* profile, QObject * parent = Q_NULLPTR)

Создает пустую страницу веб-движка в профиле профиля веб-движка с родительским родителем.

Если профиль не является профилем по умолчанию,вызывающая сторона должна обеспечить, чтобы профиль оставался активным до тех пор, пока страница работает.

Эта функция была введена в Qt 5.5.

Решение состоит в том, чтобы передать 2 параметра: профильи родитель, также, если вы не собираетесь добавлять что-либо в конструктор, нет необходимости перезаписывать это, как показано ниже:

import sys

from PyQt5.QtCore import QUrl
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWebEngineCore import QWebEngineUrlRequestInterceptor
from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEnginePage, QWebEngineProfile


class WebEngineUrlRequestInterceptor(QWebEngineUrlRequestInterceptor):
    def interceptRequest(self, info):
        # info.setHttpHeader("X-Frame-Options", "ALLOWALL")
        print("interceptRequest")
        print(info.requestUrl()) 

class MyWebEnginePage(QWebEnginePage):
    def acceptNavigationRequest(self, url, _type, isMainFrame):
        print("acceptNavigationRequest")
        print(url)
        return QWebEnginePage.acceptNavigationRequest(self, url, _type, isMainFrame)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    browser = QWebEngineView()
    interceptor = WebEngineUrlRequestInterceptor()
    profile = QWebEngineProfile()
    profile.setRequestInterceptor(interceptor)
    page = MyWebEnginePage(profile, browser)
    page.setUrl(QUrl("/12152830/qwebengineurlrequestinterceptor-ne-rabotaet"))
    browser.setPage(page)
    browser.show()
    sys.exit(app.exec_())
...