昨日のエントリではクライアントを Ruby で書いたけども、サーバ側が Python(Flask) なのでやっぱりクライアントも Python がいい。そういうわけで JSON を POST するのにいいライブラリがないかとググってみたら、requests というのが良さそうだ。
で、書いてみたのがこれ:
#!/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]
うまくいった。