こんにちは
hiroエンジニアです。
前回に引き続き、配当金の自動計算アプリを作っていきます。
前回はSBIネオモバイルから必要な情報をCSVで取得できるようになったので、それをAPIとして返却できるようにしていきたいと思います。
1. アーキテクチャ選定
APIとして公開するには、Webサーバー、APサーバーを用意し、APIを返却するWebフレームワークを選定する必要があります。
Pythonだと、Django、Flaskあたりが有名でしょうか?
今回は、単にCSVから取得した情報をJSON形式で返却するだけのシンプルなアーキテクチャなので、高機能なモノは不要で軽量なWebフレームワークとして「bottle」を採用したいと思います。
■PythonでのWEBアプリアーキテクチャ
アーキテクチャ項目 | 選定ツール・ライブラリ |
---|---|
Webサーバー | Nginx |
APサーバー | uwsgi |
Webフレームワーク | bottle |
その他 | MWはDockerを使い管理 |
まずは、DockerでNginx + uwsgiを構築します。
幸い、こちらの組み合わせとなるベースイメージとして、「tiangolo/uwsgi-nginx」が公開されてます。
今回は、こちらのイメージの「python3.8」バージョンのイメージを利用します。
FROM tiangolo/uwsgi-nginx:python3.8
2. bottleをDockerに入れてHello world を表示
次に「bottle」フレームワークを導入してHello Worldを返却するAPIを追加します。
公式のサンプルを参考に以下のファイルを追加します。
from bottle import Bottle, route, run, default_app
app = Bottle()
@route('/test')
def test():
return 'Hello World'
if __name__ == '__main__':
run(host='0.0.0.0', port=3031, debug=True, reloader=True)
else:
application = default_app()
testというURLを叩くと、Hello Worldが返却されるアプリを書いてます。
あとは、Dockerに作成したアプリを追加します。
FROM tiangolo/uwsgi-nginx:python3.8
pip install uwsgi
pip install bottle
COPY ./main.py ./
この状態で、dockerを立ち上げて、http://localhost/test
を開くと、Hello Worldが表示されると思います。

ここまで成功すれば、あとはCSVで取得した情報をJSON形式にして返却するだけです。
def get_by_csv():
print('csv test')
csv_file = open("./app/tmp/sbiNeoMible.csv", "r", encoding="utf-8", errors="", newline="" )
csv_list = csv.DictReader(csv_file, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True)
stock_list = []
for row in csv_list:
stock = Stock(row)
stock_all_price += stock.now_price_sum
stock_all_dividend += stock.dividend_money
stock_list.append(Stock(row))
・・・略・・・
return stock_list
csv.DictReaderメソッドを使うことでCSVの中身をDictionary型で取得できます、それを配列に直して返却することで完成です。(途中細かい加工処理を任意で加えてください%表示など)
この状態でAPIを叩くと株式の情報がJSONで返却できました。

今回はここまでです、次回はフロントエンドの構築を行います