昨日のエントリではクライアントを 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]
うまくいった。