JSONをPOSTする

昨日のエントリではクライアントを Ruby で書いたけども、サーバ側が Python(Flask) なのでやっぱりクライアントも Python がいい。そういうわけで JSON を POST するのにいいライブラリがないかとググってみたら、requests というのが良さそうだ。

 cf. Requests: 人間のためのHTTP

で、書いてみたのがこれ:

#!/usr/bin/env python
# encoding: utf-8

import sys
import click
import yaml
import csv
import requests

def post_book(data, uri_base):
    post_data = {
        'title' : data['title'],
        'volume' : data['volume'] or '',
        'series' : data['series'] or '',
        'series_volume' : data['series_volume'] or '',
        'author' : data['author'] or '',
        'translator' : data['translator'] or '',
        'publisher' : data['publisher'] or '',
        'category' : data['category'] or 'その他',
        'format' : data['format'] or 'その他',
        'isbn' : data['isbn'] or '',
        'published_on' : data['published_on'] or '',
        'original_title' : data['original_title'] or '',
        'note' : data['note'] or '',
        'keyword' : data['keyword'] or '',
        'disk' : data['disk'] or '',
        'disposed' : data['disposed'] or '0'
    }
    uri = uri_base + 'api/book/add/'
    res = requests.post(uri, json=post_data)
    print title_with_vol(res.json()['books'][0])

def title_with_vol(book):
    if book['volume'] == '':
        return book['title']
    else:
        return book['title'] + ' [' + book['volume'] + ']'

def load_yaml(yamlfile):
    f = open(yamlfile, 'r')
    data = yaml.load(f)
    f.close()
    return data['books']

def load_csv(csvfile):
    f = open(csvfile, 'r')
    reader = csv.DictReader(f)
    data = []
    for row in reader:
        data.append(row)
    f.close()
    return data

@click.group()
@click.pass_context
@click.option('--repository', '-R', help='Specify repository.')
def cmd(ctx, repository):
    if repository is None:
        raise click.BadParameter('--repository option is required.')
    ctx.obj['repository'] = repository.rstrip('/') + '/'

@cmd.command(help='Post books to Bruschetta.')
@click.pass_context
@click.option('--csv', is_flag=True, help='Input from CSV.')
@click.argument('input')
def post(ctx, csv, input):
    if csv:
        books = load_csv(input)
    else:
        books = yaml_load(input)
    for book in books:
        post_book(book, ctx.obj['repository'])

def main():
    cmd(obj={})


main()

ついでに、サブコマンドとオプションの処理には click というライブラリを使った。click についてはココらへんが詳しい。

 cf. Python: コマンドラインパーサの Click が便利すぎた – CUBE SUGAR CONTAINER
 cf. click

実行例:

takatoh@nightschool $ python bin/post_book.py --repository http://localhost:5000/ post --csv books.csv
ウルフ・ウォーズ
世界の涯ての夏
冴えない彼女の育てかた [9]

うまくいった。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください