2015-12-02 54 views
0

我是Dydra的注册用户,并尝试以编程方式更新存储库。尽管我已经登录,但在尝试更新存储库时出现401错误。以下是我的代码:无法使用Python登录Dydra

username = 'myUsername' 
    password = 'myPassword' 
    URL = 'http://dydra.com/login' 

    with requests.Session() as s: 
    resp = s.get(URL) 
    soup = BeautifulSoup(resp.text) 
    csrfToken = soup.find('meta',{'name':'csrf-token'}).get('content') 
    # print csrf_token 
    payload = { 
    'account[login]':username, 
    'account[password]':password, 
    'csrfmiddlewaretoken':csrfToken, 
    'next':'/' 
    } 
    print payload 

    p = s.post(URL,data=payload, headers=dict(Referer=URL)) 
    print p.text 

    r = s.get('http://dydra.com/myUsername/repoName/sparql') 
    print r.text 

    for stmt in dataGraph: 
     dydraSparqlEndpoint = 'http://dydra.com/myUsername/repoName/sparql' 
     queryStringUpload = 'INSERT DATA {%s %s %s}' % stmt 
     sparql = SPARQLWrapper(dydraSparqlEndpoint) 
     sparql.setQuery(queryStringUpload) 
     sparql.method = 'POST' 
     sparql.query() 

for语句之前的代码按预期工作。那为什么insert语句会导致认证错误?我需要在代码中更改以成功登录?

+0

我对您使用的API不够了解,但我没有看到将用户凭据连接到sparql对象的位置。我发现你之前使用凭证执行POST,但是不应该将它们也包含在sparql查询中? –

+0

我的印象是,在Session中执行SPARQL查询将会处理它。这显然不起作用。我试图弄清楚如何在查询中包含凭据。 – kurious

+0

Joshua是对的,我对Dydra也不熟悉,但是在大多数图形数据库中,您需要通过发送请求向您发送身份验证。你只是试图发布插入查询?这就是Stardog的功能:'resp = requests.post(transaction_endpoint,headers = HEADERS_RDF,data = open_file,auth = SPARQL_AUTH,palsrams = {'graph-uri':graph})' – Artemis

回答

0

基于从约书亚和阿尔特弥斯的建议,我已经能够找出方法来登录:

 key = my_dydra_key  
     dydraSparqlEndpoint = 'http://dydra.com/username/rep_name/sparql' 
     for stmt in dataGraph: 
      queryStringUpload = 'INSERT DATA {%s %s %s}' % stmt 
      sparql = SPARQLWrapper(dydraSparqlEndpoint) 
      sparql.setCredentials(key,key) 
      sparql.setQuery(queryStringUpload) 
      sparql.method = 'POST' 
      sparql.query() 

这里最重要的是sparql.setCredentials(key,key)。关键是Dydra以编程方式登录的API密钥。这是因为sparql.setCredentials需要用户名和密码作为参数。