2009-08-06 4 views
3

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

authenticationRequired (QNetworkReply*, QAuthenticator*) 

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

Из документов для authenticationRequired:

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

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

ответ

2

Да, это странно. То, что я делал раньше, это проверить, если я уже заверены эти детали, и если я затем вызвать QNetworkReply.abort()

1

Что о попытке:

QNetworkReply::abort() 

или

QNetworkReply::close() 

?

0

Вызов QNetworkReply::abort() приведет к сбою запроса с ошибкой «Operation Aborted» вместо исходной ошибки 401. Теперь правильная вещь - не звонить QAuthenticator::setUser() или QAuthenticator::setPassword() в ваш слот authenticationRequired(). Это оставит QAuthenticatorPrivate::phase как Done, что приведет к прекращению действия запроса с правильным кодом ошибки.

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

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

0

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

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

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