gpt4 book ai didi

python - 使用 CKAN API 和 Python Requests 库创建 CKAN 数据集

转载 作者:太空狗 更新时间:2023-10-30 00:50:07 25 4
gpt4 key购买 nike

我正在使用 CKAN 2.2 版并尝试自动执行数据集创建和资源上传。我似乎无法使用 python requests 库创建数据集。我收到 400 错误代码。代码:

import requests, json

dataset_dict = {
'name': 'testdataset',
'notes': 'A long description of my dataset',
}

d_url = 'https://mywebsite.ca/api/action/package_create'
auth = {'Authorization': 'myKeyHere'}
f = [('upload', file('PathToMyFile'))]

r = requests.post(d_url, data=dataset_dict, headers=auth)

奇怪的是,我能够使用 python requests 库创建新资源并上传文件。代码基于this documentation.代码:

import requests, json

res_dict = {
'package_id':'testpackage',
'name': 'testresource',
'description': 'A long description of my resource!',
'format':'CSV'
}

res_url = 'https://mywebsite.ca/api/action/resource_create'
auth = {'Authorization': 'myKey'}
f = [('upload', file('pathToMyFile'))]

r = requests.post(res_url, data=res_dict, headers=auth, files=f)

我还可以使用 CKAN 文档中的方法使用内置的 Python 库创建数据集。文档:CKAN 2.2

代码:

#!/usr/bin/env python
import urllib2
import urllib
import json
import pprint

# Put the details of the dataset we're going to create into a dict.
dataset_dict = {
'name': 'test1',
'notes': 'A long description of my dataset',
}

# Use the json module to dump the dictionary to a string for posting.
data_string = urllib.quote(json.dumps(dataset_dict))

# We'll use the package_create function to create a new dataset.
request = urllib2.Request('https://myserver.ca/api/action/package_create')

# Creating a dataset requires an authorization header.
request.add_header('Authorization', 'myKey')

# Make the HTTP request.
response = urllib2.urlopen(request, data_string)
assert response.code == 200

# Use the json module to load CKAN's response into a dictionary.
response_dict = json.loads(response.read())
assert response_dict['success'] is True

# package_create returns the created package as its result.
created_package = response_dict['result']
pprint.pprint(created_package)

我不太确定为什么我创建数据集的方法不起作用。 package_create 和 resource_create 函数的文档非常相似,我希望能够使用相同的技术。我更愿意使用请求包来处理我与 CKAN 的所有交易。有没有人能够成功地使用请求库创建数据集?

非常感谢任何帮助。

最佳答案

我终于回到了这个问题上并弄明白了。爱丽丝关于检查编码的建议非常接近。虽然 requests 确实会为您进行编码,但它也会根据输入自行决定哪种类型的编码是合适的。如果文件与 JSON 字典一起传入,requests 会自动执行 CKAN 接受的 multipart/form-data 编码,因此请求成功。

但是,如果我们传递一个 JSON 字典,则默认编码为 form 编码。 CKAN 需要对没有文件的请求进行 URL 编码(application/x-www-form-urlencoded)。为了防止 requests 进行任何编码,我们可以将参数作为字符串传递,然后 requests 将仅执行 POST。这意味着我们必须自己对其进行 URL 编码。

因此,如果我指定内容类型,将参数转换为字符串并使用 urllib 进行编码,然后将参数传递给请求:

head['Content-Type'] = 'application/x-www-form-urlencoded'
in_dict = urllib.quote(json.dumps(in_dict))
r = requests.post(url, data=in_dict, headers=head)

那么请求成功。

关于python - 使用 CKAN API 和 Python Requests 库创建 CKAN 数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24642317/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com