【開発記】配当金の自動計算アプリ作成にチャレンジ#4

こんにちは

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で返却できました。

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