Pregunta

Estoy trabajando con un servicio web que requiere un nombre de usuario / contraseña válida. De PyQt, estoy acceder al servicio web utilizando QNetworkAccessManager que emite el

authenticationRequired (QNetworkReply*, QAuthenticator*)

señal cuando (obviamente), se requiere autenticación. Cuando relleno en el usuario y para psswd QAuthenticator, todo funciona bien. Sin embargo, no puedo ver cómo romper el lazo cuando el usuario es no válida.

A partir de la documentación para authenticationRequired:

"Si rechaza las credenciales, esta señal se emitirá de nuevo."

Para obtener credenciales no válidas Esta señal se emite de nuevo, y de nuevo, y otra vez ... Mirando el código de error en la respuesta mostraron 0. ¿Cómo se supone que este bucle para ser roto o manipulado de manera que termine con un error?

¿Fue útil?

Solución

Yeh, que es extraño. Lo que he hecho anteriormente es comprobar si ya he autenticado con esos detalles y si entonces he llamar QNetworkReply.abort()

Otros consejos

¿Qué hay de tratar:

QNetworkReply::abort()

o

QNetworkReply::close()

QNetworkReply::abort() Calling hará que la solicitud a fallar con el error 'operación cancelada' en lugar del error original 401. Lo que se debe hacer ahora parece ser que no llamara QAuthenticator::setUser() o QAuthenticator::setPassword() dentro de su ranura authenticationRequired(). Esto dejará el QAuthenticatorPrivate::phase como Done lo que hará que la solicitud para terminar limpiamente con el código de error correcto.

La documentación de Qt es bastante claro en este punto.

Esto no parece ser el comportamiento en Qt 4.7, y se introdujo en un cierto punto en Qt 4.8.

Si regrese de una ranura conectada a & QNetworkAccessManager :: proxyAuthenticationRequired sin llamar a cualquier método QAuthenticator, la solicitud será abortado con código real HTTP (por ejemplo 401 o 407).

Por ejemplo, puede llamar QAuthenticator :: setUser y setPassword cuando los clics de usuario OK y llamar nada cuando CLICS Cancelar. Eso es todo: -)

Esto también es cierto para las ranuras y conectado a QNetworkAccessManager :: authenticationRequired (en el que no tiene que llamar QNetworkReply :: abortar (), sólo tiene que llamar a ningún método QAuthenticator en absoluto, que conservan código HTTP también, mientras que llamar a abortar ( ) alterarlo).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top