1

我根据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.p​​y”,第 21 行,结果中 = sparql.query().convert() 文件“/usr/local/lib/python2.7/site-packages/SPARQLWrapper/Wrapper .py”,第 601 行,查询返回 QueryResult(self._query()) 文件“/usr/local/lib/python2.7/site-packages/SPARQLWrapper/Wrapper.py”,第 581 行,在 _query raise e urllib2 .HTTPError:HTTP 错误 401:未经授权

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

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

4

1 回答 1

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)

除了userand之外password,还有另一个变量realm.(默认值为"SPARQL"),但VirtSPARQLProtectSQLDigestAuthentication将领域设置为"SPARQL Endpoint"

因此,解决方案只是将您的演奏家的领域更改为"SPARQL".

于 2017-05-30T07:21:29.527 回答