Лучший способ записать файл JSON в БД? - PullRequest
1 голос
/ 20 апреля 2011

Вот сценарий: -Я пользуюсь сервисом embed.ly для получения метаданных о пользовательских ссылках (дополнительная информация об этом сервисе: http://api.embed.ly/docs/oembed) -Я использую этот контент для создания предварительного просмотра контента на моем сайте -При отправке URL-адреса для embed.ly сервис возвращает мне файл JSON, содержащий метаданные -Я хочу записать это в базу данных, так как пользователи будут неоднократно получать доступ к этой информации на моем сайте -Я пользуюсь Django

У меня работает сценарий. Ниже мой код. Что мне не нравится в этом, так это то, что он жестко кодирует ключи, найденные в файле JSON. Если ключи меняются или не предоставлены в данном запросе, то все ломается. Я могу исправить более позднюю проблему, но было любопытно, если бы у кого-то был другой подход, который допустил бы потерю данных или смену ключей.

Вот код Python, который генерирует файл JSON (полученный из 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 голосов
/ 20 апреля 2011

Учитывая, что действительные ключи определены в документации repedse от 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]
...