Python, Flaskを使ってweb appを作るプロセス

こんにちは、筋肉めがねです。

 

ドイツ銀行が大量のリストラを発表しましたね。2022年までに、フルタイム従業員の約2割に相当する約18,000人のリストラを実施するという事です。幾つかの記事を読んだところ、今回のリストラの引き金となった事が大きく二つあるようですね。一つはコメルツ銀行との経営統合が破断になった事。合併すると約30,000人の雇用削減を行う可能性がある、という事から、労働組合からの大きな反発があったようです。結局、破断となったため、自社で経営を再建する道を選ぶしかなかった、という事ですね。ドイツ銀行のPLには、2018年のcost/income ratioは92.7%とあります。少し古い資料ですが、S&Pが2016年にまとめたレポートに掲載されている数値と比較するとだいぶ高い事がわかりますね。ドイツ銀行は、収益に対するコストが高い、という体質を抜本的に見直し、2022年までには同指標を70%まで落とす、という見通しです。

www.spglobal.com

 

もう一つは、 低金利の長期化が理由、という事です。銀行からお金を借りたい事業主や、お金を借りたい一般消費者からすると、銀行の金利が低いことは嬉しいですし、消費を促し経済を循環させますね。一方で銀行側からすると、金利が低いと、その分借主から入ってくる利息が小さくなり財政が悪化するんですね。

 

それでは、本日はPython, Flaskを使ってweb appを作るプロセスについて書いていきましょう。

以前、Kaggleの物件分析competitionから派生してドイツの物件情報を分析しました。この時はじめてスクレイピングという技術を学び、10,000件を超える物件情報を取得しました。この技術を使用して、ひとつwebを作っていきたいと考えています。

 

kinnikumegane.hatenablog.com

まずは、どういう技術を使うか、というところですが、スクレイピングにはpythonを使用し、webフレームワークとしてflaskを使用します。サーバーはherokuを使用します。それらを使ってドイツの物件情報をユーザーに届けるwebを作りたいのですが、いかんせんどうアプローチして良いのか、知見がありません。という事で、素晴らしいチュートリアルがあるので、そちらを使用してwebアプリを一つ作って見て、知見を得ましょう。

note.mu

基本的にはチュートリアル通りに進めていけば問題はありませんが、僕の場合は、幾つかスムーズに進める事ができなかった箇所があるので、その時の解決策を主に書いていきましょう。

 

 

はじめに、成果物はこちらでございます。

top-tweets-kinnikumegane.herokuapp.com

 

Pythonの開発環境をMac terminalで構築する

アプリを作り、deployした際に、一発で思惑通りにアプリが表示されないという事がありますよね。それはいろんなチュートリアル、ブログを参考にして開発環境を作ろうとして、最終的に必要のないものがインストールされたり、pythonのバージョンが複数存在するようになる事が原因となっている事があります。

今回も、アプリをdeploy後、そういう状況になり、数週間なかなか前に進めなかったので、はじめにどのように環境を構築しておくべきか書いておきます。

kandai.hatenadiary.jp

 

環境はmacOS Sierra Version 10.12.6です。

まず、terminal上で以下の2つのコマンドでpyenv-virtualenvとpyenvをアンインストールします。

brew uninstall pyenv-virtualenv
brew uninstall pyenv

つづいてbrewおよびbrewでインストールされた全てのパッケージをアンインストール。

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"

一旦、環境のクリーンアップを終了、ここから構築します。

homebrewのインストール。

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

pyenvのインストール。

brew install pyenv

環境変数の設定など。

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
source ~/.bash_profile

そして、python 3.6.3をインストール。そして、python 3.6.3をglobal(システム上のデフォルトのpython)へと変更します。

pyenv install 3.6.3
pyenv global 3.6.3

この時点で、pyenv versionsと打つと、

pyenv versions
system
2.7.11
3.5.1
* 3.6.3 (set by /Users/xxxx/.python-version)
3.7.3

なるほど、環境構築に複数のブログ、チュートルアルを参考にしてきた弊害が出てきましたね。一旦、python3.5.1とpython3.7.3を削除します。

pyenv uninstall 3.5.1
pyenv uninstall 3.7.3

もう一度、pyenv versionsで確認すると、

pyenv versions
  system
  2.7.11
* 3.6.3 (set by /Users/xxxx/.python-version)

不要なpythonが削除されましたね。

ここで、python --versionと打つと、python 3.6.3と表示される事を確認しました。

大事なことは、pyenv versionsでglobal設定されているpythonのバージョンと、python --versionで表示されるpythonのバージョンが同じである事ですね。

python --version

 

これで環境構築は終了でございます。

 

ローカル環境でweb作成

ここから、一気にDaiさんのチュートルアルに沿ってwebアプリを作っていったわけですが、終盤まで頭を悩ませた事は仮想環境の構築でした。結局、仮想環境を作らなくともアプリを実現できるわけで、仮想環境は結局使わなくても良い、という事ですね。pythonの、あるバージョン限定でしか機能しないライブラリを使用する場合など、用途が複数ある場合には仮想環境を使う事が有効ですが、今回のように一つのアプリのみを作成する場合、rootで実施しても問題ありません。もちろん、実用的ではありませんが、今回はroot下で進めていきましょう。

punhundon-lifeshift.com

 

さて、top tweeetsのアプリを作る上で、幾つかつまづいた点があったため、補足事項を書いていきます。

terminal上でpython3 app.pyと記述し、runするわけですが、その際幾つかエラーがでてきました。例えばpandasがインストールされていないとか。その場合、top-tweetsのフォルダ下で、pandasをインストールしましょう。

また、flaskがインストールされていない、tweepyがインストールされていないとエラーがでる事がありますので、それぞれインストールしましょう。そしてpipのバージョンをアップグレードする事も大事なようです。pip install --upgrade pipでバージョンを19にアップグレードしておきました。

import pandas as pd
sudo pip3 install flask
sudo pip3 install tweepy
pip install --upgrade pip

 

この時点で、terminal上でrun(python3 app.py)するとようやくアプリが表示されました。ちなみにまだローカル環境上ですね。ここまで2週間ぐらいあーだこーだトライしてもエラーがばかり出ていたので、アプリが表示された時は感慨深いものがありました。

そして、テキストボックスにidを入れてボタンを押すと、、、、またしてもエラーでございます。

コーディングする上でついてまわるのはbug fixですよね。

以下のコードをapp.pyに埋め込む事で、エラーが起きた後にterminal上でerror logを表示させる事ができます。

import sys
print('This is error output', file=sys.stderr)
print('This is standard output', file=sys.stdout)

エラーの原因はどうやらhtmlにあったようです。

チュートリアル通りに進めると、twitterへ連携するcreated_atという項目とtweepyで使用するcreated_atという項目が同じ名前であるため、システムが混乱している、というエラーがでます。

ValueError: 'created_at' is both an index level and a column label, which is ambiguous.

よって、以下のように変更を加えました。

以下は変更。

f:id:KinnikuMegane:20190714001652p:plain

こちらは変更なし。

f:id:KinnikuMegane:20190714001703p:plain

created_at_in_columnsへ変更するのは、app.py内に幾つかありますし、そして、index.html内にも幾つかあるので、必要な箇所は全て変更する必要がありますね。

ここで、改めてローカル環境上でrunし、idを入れてボタンを押すとようやく動きました。

 

Herokuへdeploy

最後にherokuへのdeployでございます。

deployする前に3つのファイルを準備しますが、その前にgunicornをインストールしておきます。

pip3 install gunicorn

そして、以下3つのファイルを作成し、herokuをインストール、そしてherokuへログインします。

requirements.txt

runtime.txt

Procfile

brew tap heroku/brew && brew install heroku
heroku login --interactive

terminal上でログインしたいので、--interactiveとしましょう。

もちろん、heroku上でアカウントを作成することは事前に実施しておく必要がありますね。

 

そして以下の5つのコマンドをrunすると、

git add -A
git commit -m "deploy heroku"
git push heroku master
heroku ps:scale web=1
heroku open


 

できました!

世界のKeisuke Hondaのツイッター情報が綺麗に表示されましたね!

 

それでは、本日は以上でございます。

 

にほんブログ村 IT技術ブログへ
にほんブログ村



Pythonランキング