2016-12-21 8 views
1

Ich versuche, eine Ressource in einer Instanz von CKAN zu aktualisieren. Ich benutze demo.ckan.org um einen Test zu machen.Update-Ressource in CKAN mit Python

Ich bin in der Lage, eine Ressource für ein Dataset mit curl zu erstellen und zu aktualisieren, aber mit Python kann ich dies nicht tun.

Mein Startpunkt ist dieser Link: http://docs.ckan.org/en/latest/maintaining/filestore.html#filestore-api

Dies ist der Code:

import requests 
requests.post('http://0.0.0.0:5000/api/action/resource_create', 
       data={"package_id":"my_dataset"}, 
       headers={"X-CKAN-API-Key": "21a47217-6d7b-49c5-88f9-72ebd5a4d4bb"}, 
       files=[('upload', file('/path/to/file/to/upload.csv'))]) 

Mein curl Code funktioniert ok, so habe ich versucht, es zu adaptieren:

curl -X POST http://demo.ckan.org/api/3/action/resource_update -d '{"id":"5b75fdf2-df9c-4a4f-bb28-d78ea7bc4e48", "url": "http://82.98.156.2/ckan_api/public_html/restaurantes.geojson", "name": "Better Restaurants", "format":"GEOJSON", "description":"Description of the resource"}' -H "Authorization: 97caad21-8632-4372-98fe-a24cdcaa90dc" 

Dies sollte der Code in Python sein:

resource_dict = { 
    'id': '5b75fdf2-df9c-4a4f-bb28-d78ea7bc4e48', 
    'name':'REstaurantes con PYTHON', 
    'url':'http://82.98.156.2/ckan_api/public_html/restaurantes.geojson', 
    'description':'Description in PYTHON' 
} 
resource_dict = urllib.quote(json.dumps(resource_dict)) 
requests.post('http://demo.ckan.org/api/3/action/resource_update', 
       data=resource_dict, 
       headers={"Authorization: 97caad21-8632-4372-98fe-a24cdcaa90dc"}) 

Ich habe diese alte Verbindung gefunden: Create CKAN dataset using CKAN API and Python Requests library

Am Ende es vorschlägt, einige Informationen hinzuzufügen, aber ich kann es zu tun, herauszufinden.

Irgendein Vorschlag ???

Antwort

1

Dies zu funktionieren scheint:

resource_dict = {'id': '5b75fdf2-df9c-4a4f-bb28-d78ea7bc4e48', 
       'name':'REstaurantes con PYTHON', 
       'url':'http://82.98.156.2/ckan_api/public_html/restaurantes.geojson', 
       'description':'Description in PYTHON'} 
requests.post('http://demo.ckan.org/api/3/action/resource_update', 
      json=resource_dict, 
      headers={"Authorization": "97caad21-8632-4372-98fe-a24cdcaa90dc"}) 

Mindestens state_code ist 200 und ich bekam "success": true als Antwort.

Bitte beachten Sie, dass {"Authorization: 97caad21-8632-4372-98fe-a24cdcaa90dc"} in Ihrem Code-Datentyp ist class 'set' während headers Daten von class 'dict', wie "Authorization": "97caad21-8632-4372-98fe-a24cdcaa90dc"}

+0

Awesome !!, Dank Andersson – davisoski

2

Sie nicht mit Python-Anfragen stören bekommen sollte - es ist am einfachsten in Python die hervorragende ckanapi Bibliothek zu verwenden. z.B.

import ckanapi 
ckan = ckanapi.RemoteCKAN('http://demo.ckan.org/', apikey='97caad21-8632-4372-98fe-a24cdcaa90dc', user_agent='ckanapi so test') 
resource_dict = { 
    'id': '5b75fdf2-df9c-4a4f-bb28-d78ea7bc4e48', 
    'package_id': 'cdcf576d-0b09-4df0-a506-61a7142d2b8f', 
    'name':'Restaurantes con PYTHON', 
    'url':'http://82.98.156.2/ckan_api/public_html/restaurantes.geojson', 
    'description':'Description in PYTHON', 
    'format':'GEOJSON' 
} 
ckan.action.resource_update(**resource_dict) 
+0

great !! Arbeiten, Dank – davisoski

+1

Große, bitte oben-vote verwenden und wählen Sie die beste Antwort dann. –

+0

Ich berechnete die Zeit, um zu sehen, welche Option schneller ist, aber beide sind gleich – davisoski