Вопрос

Я работаю с веб-сервисом, для которого требуется действительное имя пользователя/пароль.Из PyQt я получаю доступ к веб-сервису с помощью QNetworkAccessManager, который выдает

authenticationRequired (QNetworkReply*, QAuthenticator*)

сигнал, когда (очевидно) требуется аутентификация.Когда я заполняю пользователя и PSSWD для Qauthenticator, все работает нормально.Однако я не вижу, как разорвать цикл, когда пользователь нет действительный.

Из документов для аутентификацииRequired:

«Если он отклонит учетные данные, этот сигнал будет отправлен снова».

Для недопустимых учетных данных этот сигнал снова испускается, и снова, и снова ...Просмотр кода ошибки в ответе показал 0.Как этот цикл следует прервать или обработать, чтобы он завершился с ошибкой?

Это было полезно?

Решение

Да, это странно.Ранее я проверил, прошел ли я уже аутентификацию с этими данными, и если прошел, то позвоню. QNetworkReply.abort()

Другие советы

А как насчет того, чтобы попробовать:

QNetworkReply::abort()

или

QNetworkReply::close()

?

Вызов QNetworkReply::abort() приведет к сбою запроса с ошибкой «Операция прервана» вместо исходной ошибки 401.Кажется, сейчас правильнее не звонить. QAuthenticator::setUser() или QAuthenticator::setPassword() внутри твоего authenticationRequired() слот.Это оставит QAuthenticatorPrivate::phase как Done что приведет к правильному завершению запроса с правильным кодом ошибки.

Документация Qt довольно неясна по этому поводу.

Похоже, такого поведения не было в Qt 4.7, и оно было введено в какой-то момент в Qt 4.8.

Если вы вернетесь из слота, подключенного к &QNetworkAccessManager::proxyAuthenticationRequired, без вызова какого-либо метода QAuthenticator, запрос будет прерван с использованием реального HTTP-кода (например,401 или 407).

Например, вы можете вызвать QAuthenticator::setUser и setPassword, когда пользователь нажимает «ОК», и ничего не вызывать, когда он нажимает «Отмена».Вот и все :-)

Это также верно для слотов, подключенных к &QNetworkAccessManager::authenticationRequired (где вам не нужно вызывать QNetworkReply::abort(), вы можете просто вообще не вызывать метод QAuthenticator, который также сохраняет HTTP-код, тогда как вызов abort() изменяет его ).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top