有没有更好的方法将JSON文件写入数据库?
这是一个场景:
- 我正在使用embed.ly的oembed服务来获取用户提交链接的元数据(关于这个服务的更多信息可以查看:http://api.embed.ly/docs/oembed)
- 我用这些内容在我的网站上生成预览
- 当我提交一个网址给embed.ly时,这个服务会返回一个包含元数据的JSON文件
- 我想把这些数据写入数据库,因为用户会在我的网站上反复访问这些信息
- 我使用的是Django框架
我已经把脚本搞定了。下面是我的代码。不过我不喜欢的是,它把JSON文件中的键写死了。如果这些键发生变化,或者某次查询没有提供这些键,程序就会出问题。我可以解决后面的问题,但我想知道有没有其他方法可以处理缺失的数据或变化的键。
下面是生成JSON文件的Python代码(这个是从embed.ly获取的):
def submit_content(request):
import urllib
import urllib2
try:
import json
except ImportError:
try:
import simplejson as json
except ImportError:
raise ImportError("Need a json decoder")
ACCEPTED_ARGS = ['maxwidth', 'maxheight', 'format']
def get_oembed(url, **kwargs):
"""
Example Embedly oEmbed Function
"""
api_url = 'http://api.embed.ly/1/oembed?'
params = {'url':url }
for key, value in kwargs.items():
if key not in ACCEPTED_ARGS:
raise ValueError("Invalid Argument %s" % key)
params[key] = value
oembed_call = "%s%s" % (api_url, urllib.urlencode(params))
return json.loads(urllib2.urlopen(oembed_call).read())
这是我把数据写入数据库的代码:
if request.method == 'POST':
form = SubmitContent(request.POST)
if form.is_valid():
user = request.user
content_url = form.cleaned_data['content_url']
url_return = get_oembed(content_url)
recordSave = ContentQueue(submitted_url=content_url)
for key in url_return:
if key == 'provider_url':
recordSave.provider_url = url_return[key]
if key == 'description':
recordSave.description = url_return[key]
if key == 'title':
recordSave.title = url_return[key]
if key == 'url':
recordSave.content_url = url_return[key]
if key == 'author_name':
recordSave.author_name = url_return[key]
if key == 'height':
recordSave.height_px = url_return[key]
if key == 'width':
recordSave.width_px = url_return[key]
if key == 'thumbnail_url':
recordSave.thumbnail_url = url_return[key]
if key == 'thumbnail_width':
recordSave.thumbnail_width = url_return[key]
if key == 'version':
recordSave.version = 1
if key == 'provider_name':
recordSave.provider_name = url_return[key]
if key == 'cache_age':
recordSave.cache_age = url_return[key]
if key == 'type':
recordSave.url_type = url_return[key]
if key == 'thumbnail_height':
recordSave.thumbnail_height = url_return[key]
if key == 'author_url':
recordSave.author_url = url_return[key]
recordSave.user = user
1 个回答
0
根据embedly的响应文档,有效的键值是有定义的。你可以通过在一个地方列出支持的响应键和它们的翻译,让你的代码更容易维护,这样可以减少重复的代码。
举个例子:
# embed.ly keys which map 1:1 with your database record keys
RESPONSE_KEYS = set([
'provider_url', 'description', 'title', 'author_name', 'thumbnail_url',
'thumbnail_width', 'thumbnail_height', 'author_url'
])
# mapping from embed.ly's key name to your database record key
KEY_MAP = {
'url': 'content_url',
'width': 'width_px',
'height': 'height_px',
'type': 'url_type'
}
url_return = get_oembed(content_url)
record = ContentQueue(submitted_url=content_url)
record.version = 1
# iterate over the response keys and add them to the record
for key_name in url_return.iterkeys():
key = key_name if key_name in RESPONSE_KEYS else KEY_MAP.get(key_name)
if key:
record[key] = url_return[key_name]