Python QNetworkAccessManager的Qt HTTP身份验证
我正在使用一个需要有效用户名/密码的Web服务。在PyQt中,我使用发出Python QNetworkAccessManager的Qt HTTP身份验证,python,qt,networking,qt4,pyqt,Python,Qt,Networking,Qt4,Pyqt,我正在使用一个需要有效用户名/密码的Web服务。在PyQt中,我使用发出 authenticationRequired (QNetworkReply*, QAuthenticator*) 当(显然)需要身份验证时发出信号。当我填写用户和psswd时 QAuthenticator,一切正常。但是,当用户无效时,我看不出如何打破循环 从需要进行身份验证的文档中: 如果拒绝凭据,此信号将再次发出 对于无效凭证,此信号会一次又一次发出,并且 再一次。。。查看回复中的错误代码显示0。这个循环应该如何被打
authenticationRequired (QNetworkReply*, QAuthenticator*)
当(显然)需要身份验证时发出信号。当我填写用户和psswd时
QAuthenticator,一切正常。但是,当用户无效时,我看不出如何打破循环
从需要进行身份验证的文档中:
如果拒绝凭据,此信号将再次发出
对于无效凭证,此信号会一次又一次发出,并且
再一次。。。查看回复中的错误代码显示0。这个循环应该如何被打破或处理,从而以错误终止?是的,这很奇怪。我之前所做的是检查我是否已经使用这些详细信息进行了身份验证,然后调用
QNetworkReply.abort()
QNetworkReply::abort()
或
?调用QNetworkReply::abort()
将导致请求失败,错误为“操作已中止”,而不是原来的401错误。现在要做的正确的事情似乎不是在authenticationRequired()插槽中调用QAuthenticator::setUser()
或QAuthenticator::setPassword()
。这将使QAuthenticatorPrivate::phase
保持为Done
,这将导致请求以正确的错误代码完全终止
Qt文档在这一点上相当不清楚
这似乎不是Qt 4.7中的行为,是在Qt 4.8中的某个时候引入的。如果您从连接到&QNetworkAccessManager::proxyAuthenticationRequired的插槽返回,而不调用任何QAuthenticator方法,则请求将使用真实的HTTP代码(例如401或407)中止
例如,当用户clics确定时,您可以调用QAuthenticator::setUser和setPassword;当用户clics取消时,您可以不调用任何内容。仅此而已:-)
对于连接到&QNetworkAccessManager::authenticationRequired的插槽也是如此(在不必调用QNetworkReply::abort()的情况下,可以根本不调用QAuthenticator方法,这也会保留HTTP代码,而调用abort()则会改变它)
QNetworkReply::close()