我根据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:未经授权
我的操作有什么问题?用户名和密码都是正确的。
感谢如果有人可以提供帮助。
答案 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)
除user
和password
外,还有另一个变量realm
。(默认值为"SPARQL"
),但VirtSPARQLProtectSQLDigestAuthentication将域设置为{{ 1}}。
所以解决方案就是将你的艺术家领域改为"SPARQL Endpoint"
。