2015-12-02 4 views
0

Я зарегистрированный пользователь с Dydra и пытаюсь программно обновить репозиторий. Несмотря на то, что я вошел в систему, я получаю ошибку 401 при попытке обновить репозиторий. Ниже приведен мой код:Невозможно войти в Dydra с помощью Python

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

У меня создалось впечатление, что выполнение запроса SPARQL внутри сеанса позаботится об этом. Это явно не работает. Я пытаюсь выяснить, как включить учетные данные с запросом. – kurious

+0

Джошуа прав, я тоже не знаком с Dydra, но в большинстве баз данных графа вам нужно отправить аутентификацию с помощью запроса на отправку. Вы только пытаетесь опубликовать запрос вставки? Вот как работает Stardog: 'resp = request.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). Ключ - это ключ API, который Dydra дает вам для входа в систему программно. Это повторяется, потому что sparql.setCredentials нуждается в имени пользователя и пароле в качестве параметров.

Смежные вопросы