SPARQLWrapper HTTP错误401:未经授权

时间:2017-05-30 06:24:41

标签: python sparql http-status-code-401 virtuoso sparqlwrapper

我根据VirtSPARQLProtectSQLDigestAuthentication通过SQL帐户保护了我的SPARQL端点。

在此操作之前,我可以通过代码获取数据:

from SPARQLWrapper import SPARQLWrapper, JSON, DIGEST   

sparql = SPARQLWrapper("http://example.org/sparql")
sparql.setQuery("...") 
sparql.setReturnFormat(JSON)
results = sparql.query().convert()

之后,我使用DIGEST方式获取数据,

from SPARQLWrapper import SPARQLWrapper, JSON, DIGEST

sparql = SPARQLWrapper("http://example.org/sparql")

sparql.setHTTPAuth(DIGEST)
sparql.setCredentials('login', 'password')

sparql.setQuery("...")
sparql.setReturnFormat(JSON)

results = sparql.query().convert()

,错误401发生:

  

回溯(最近一次呼叫最后):文件" 1.py",第21行,in       results = sparql.query()。convert()File" /usr/local/lib/python2.7/site-packages/SPARQLWrapper/Wrapper.py",   第601行,在查询中       return QueryResult(self._query())File" /usr/local/lib/python2.7/site-packages/SPARQLWrapper/Wrapper.py",   第581行,在_query中       raise e urllib2.HTTPError:HTTP错误401:未经授权

我的操作有什么问题?用户名和密码都是正确的。

感谢如果有人可以提供帮助。

1 个答案:

答案 0 :(得分:2)

好吧,我在写完问题几分钟后就找到了答案,这让我想起了RTFSC。

Wrapper.py中的第574~581行:

elif self.http_auth == DIGEST:
    realm = "SPARQL"
    pwd_mgr = urllib2.HTTPPasswordMgr()
    pwd_mgr.add_password(realm, uri, self.user, self.passwd)
    opener = urllib2.build_opener()
    opener.add_handler(urllib2.HTTPDigestAuthHandler(pwd_mgr))
    urllib2.install_opener(opener)

userpassword外,还有另一个变量realm。(默认值为"SPARQL"),但VirtSPARQLProtectSQLDigestAuthentication将域设置为{{ 1}}。

所以解决方案就是将你的艺术家领域改为"SPARQL Endpoint"