2015-12-02 38 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需要用戶名和密碼作爲參數。