使用ckanapi和Python创建包含资源的CKAN包/数据集

2024-05-23 22:56:18 发布

您现在位置:Python中文网/ 问答频道 /正文

CKAN提供了^{}包,用于通过Python或命令行访问{a2}。在

我可以用它来下载元数据、创建资源等,但我不能在一个API调用中创建包并将资源上载到它。(包也称为数据集。)

在内部,ckanapiscans all keys moving any file-like parameters into a separate ^{},它passes to the ^{} parameter。在

这是我能得到的最接近的结果,但是CKAN返回一个http500错误(复制自this guide to ^{}):

with ckanapi.RemoteCKAN('http://myckan.example.com', apikey='real-key', user_agent=ua, username='joe', password='pwd') as ckan:
    ckan.action.package_create(name='joe_data',
                               resources=('report.xls',
                                          open('/path/to/file.xlsx', 'rb'),
                                          'application/vnd.ms-excel',
                                          {'Expires': '0'}))

我也尝试过resources=open('path/file')files=open('file'),更短或更长的元组,但是得到同样的500错误。在

requests文档说明:

^{pr2}$

我不能传递ckanapiresources={'filename': open('file')},因为ckanapi没有检测到该文件,尝试将其作为普通参数传递给requests,但失败了(“BufferedReader不是JSON可序列化的”,因为它试图将文件设为POST参数)。如果我试图传递一个文件列表,我也会得到同样的结果。但是the API is able to在一个调用中创建一个包并添加多个资源。在

那么如何使用一个ckanapi调用创建一个包和多个资源?在


Tags: 文件theto数据pathapi错误ckan
1条回答
网友
1楼 · 发布于 2024-05-23 22:56:18

我对此很好奇,我想我应该做些东西来测试一下。不幸的是,我还没有玩过你提到的CLI。但我希望这能帮助你和其他人在这件事上跌跌撞撞。在

我不肯定,但我猜你的资源字典格式不正确。资源需要是字典列表。在

这里有一个ruby脚本来执行单个api调用插入(我现在的首选语言):

# Ruby script to create a package and resource in one api call. 
# You can run this in https://repl.it/languages/ruby
# Don't forget to update URLs and API key.
require 'csv'
require 'json'
require 'net/http'

hash_to_json = {
                  "title" => 'test1',
                  "name" => 'test1',
                  "owner_org" => 'bbb9682e-b58c-4826-bf4b-b161581056be',
                  "resources" => [ 
                    {
                      "url" => 'http://www.resource_domain.com/doc.kml'
                    }
                  ]
                }.to_json

uri = URI('http://ckan_app_domain.com:5000/api/3/action/package_create')

Net::HTTP.start(uri.host, uri.port) do |http|
  request = Net::HTTP::Post.new uri

  request['Authorization'] = 'user-api-key'
  request.body = hash_to_json

  response = http.request request
  puts response.body
end

这里有一个简单的python脚本来做同样的事情(感谢您为我修改的模板CKAN docs)

^{pr2}$

相关问题 更多 >