連載第十一回目です。
Python3.6.8+FlaskでMariaDBに接続・データベースを編集するアプリを動作させる設定を行い、動作確認します。
この記事は、VPSで作るPythonでのWebアプリ運用環境の連載記事です。
その他については上記ページをお読みください。
作業予定
作業予定としては、下記のアプリを作っていきます。
まず動かしてみて、その後でFlaskの各関数が何をしているか解説していきます。
ディレクトリ構成
/usr/share/nginx ┗ app アプリ用ディレクトリ | ┗ flask_db テストアプリ用ディレクトリ | ┗ app.py アプリ本体 | ┗ config.py 設定ファイル | ┗ database.py データベース用関数ファイル | ┗ models.py データベースモデル設定ファイル | ┗ run.py 起動ファイル ┗ venv 仮想環境用ディレクトリ ┗ flask_db テストアプリ用環境
機能
・データベース参照(/)
・1行追加(/insert)
・1行変更(/update)
・1行削除(/delete)
作業内容
まず、テストアプリプログラムファイルのダウンロードが必要です。
Github(https://github.com/R2002/flask_database_test)
アップロードして使用しますので、適宜内容を見てご利用ください。
まずは、ディレクトリを移動します。
cd /usr/share/nginx
次に、アプリ用ディレクトリを作ります。
mkdir app/flask_db
仮想環境を作り、その仮想環境に入ります。
python3 -m venv venv/flask_db source venv/flask_db/bin/activate
pipをアップグレードしておきます。
pip install --upgrade pip
ダウンロードしたファイルの中にあるrequirements.txtアップロードし、テストアプリに必要なPythonモジュールを下記コマンドでインストールします。仮想環境上でインストールするようにしてください。
pip install -r requirements.txt
ファイルをアップロードできない場合は、パーミッション変更を下記の通り行ってみてください。
chmod 0777 /usr/share/nginx
requirements.txtファイルの内容は以下の通りです。
flask==1.1.2 flask-sqlalchemy==2.5.0 SQLalchemy==1.3.23 pymysql==1.0.2 Flask-Migrate==2.7.0
簡易アプリ(main.py)作成し、複数アプリを同時並行でNginx Unitでデプロイできることを確認します。
まずは、アプリ用ディレクトリに移動します。
cd app/flask_db [python] 続いて、<strong>main.py</strong>を作成します。 [python] from flask import Flask application = Flask(__name__) @application.route('/') def index(): print('test') return "Hello Flask" if __name__ == '__main__': application.run()
/usr/share/nginx/conf.jsonを編集し、flask_testに加え新たなアプリ(flask_db)を起動できるようにします。
{ "listeners": { "*:8081": { "application": "flask_test" }, "*:8082": { "application": "flask_db" }, }, "applications": { "flask_test": { "type": "python 3.6.8", "path": "/usr/share/nginx/app/flask_test/", "home": "/usr/share/nginx/venv/flask_test/", "module": "main" }, "flask_db": { "type": "python 3.6.8", "path": "/usr/share/nginx/app/flask_db/", "home": "/usr/share/nginx/venv/flask_db/", "module": "main" }, } }
Nginx Unitの設定を更新します。
sudo curl -X PUT --data-binary @/usr/share/nginx/conf.json --unix-socket /var/run/unit/control.sock http://localhost/config
Nginxの設定ファイル(/etc/nginx/conf.d/default.conf)に下記を追記します。
location /flask_db/ { proxy_pass http://127.0.0.1:8082/; }
再起動をしてみましょう。
systemctl restart nginx systemctl restart unit
下記のURLでアクセスできるようになります。
http://XXX.XXX.XXX.XXX/sample/
→ 前回のテストアプリ
http://XXX.XXX.XXX.XXX/flask_db/
→ 同じようなテスト用アプリ
今後は、flask_dbを改良していきます。
それでは、ファイルアップロードのためのパーミッション変更を行います。
cd /usr/share/nginx chmod 0777 app/flask_db
conf.jsonを編集し、applicationsのflask_db、moduleをmainからrunにしてください。
{ "listeners": { # 略 }, "applications": { "flask_test": { # 略 }, "flask_db": { # run "module": "run" # ここだけ変更 }, } }
Nginx Unitの設定を更新します。
sudo curl -X PUT --data-binary @/usr/share/nginx/conf.json --unix-socket /var/run/unit/control.sock http://localhost/config
phpMyAdminで、新しいデータベースflask_dbを作っておきます。照会順序はutf8_general_ciで問題ありません。
http://XXX.XXX.XXX.XXX/phpMyAdmin/
最後に、アプリ設定ファイル(app/flask_db/config.py)を編集し、phpMyAdminで設定したユーザーのパスワードを記載します。
再起動をしておきましょう。
systemctl restart nginx systemctl restart unit
ここまでで設定は終わりです!
おつかれさまでした。
あとは実際にアプリを触っていきます。
まず、データベースをcreateします。
そのためにflask_db仮想環境に入っておき、ディレクトリを/usr/share/nginx/app/flask_dbに移動します。
続いて、pythonコマンドでPythonインタプリンタを起動し、下記コマンドを入力します。
from app import create_app from database import db db.create_all(app=create_app())
データベースの内容(testテーブル)ができたことを確認してください!
続いて、データベースのMigrate(差分保存)初期設定を行っておきます。
Pythonインタプリンタから出て、下記コマンドを実行します。
set FLASK_APP=run.py flask db init
※Migrateについての詳細は、Flask-migrateをご覧ください。
それではWebサイトにアクセスします。
まずはトップページ(/flask_db/)を確認します。
まだデータが入っていないため、テーブルは空です。
※このトップページはphpMyAdmin(flask_dbのtestテーブル内)と同じ表示になります。
では、データを入れていきましょう。
データ追加は、/insert/<入れたい値>にアクセスしてください。
テストでは100, 200, 300, 400, 5000の5つの数値をそれぞれ入力しました。
トップページ(/flask_db/)を確認すると、下記のようにデータベースに行が追加されました。
続いて、特定のidの値(data)を更新していきます。
更新は、/update/<id>/<変更したい値>にアクセスしてください。
テストでは/update/3/0, /update/4/100にアクセスしました。
トップページ(/flask_db/)を確認すると、下記のようにデータベースのid3および4の値が変更されました。
最後に、特定のidを削除します。
削除は、/delete/<id>にアクセスしてください。
テストでは/delete/3にアクセスしました。
トップページ(/flask_db/)を確認すると、下記のようにデータベースのid3が削除されました。
これにてテストアプリのテスト起動は終了しました。
締めに、アプリの解説を行います。
アプリの構造は以下の通りです。
HTTP接続からNginx、NginxからNginx Unit、Nginx Unit上でvenvを使ってアプリを起動し、MariaDBにアクセスする方法を取っています。
ファイルの内容については以下の通りです。
app.pyがアプリ本体です。conf.jsonに指定したrun.pyは起動用のアプリであって本体ではありません。
このような構成にすることで、ファイルごとに役割分担を明確にしています。かつ、Nginx Unit以外のAPサーバー(例:uWSGI)などでも動かせるような構成となっています。
おわりに
PythonでMariaDB(MySQL)へ接続できるアプリを触ってみようということで、今回いろいろと設定を行いました。
このアプリをWebサーバー上で起動できれば、その他の応用アプリも起動が可能になります。
ただ、当アプリはapp.pyにルーティングや表示のコードが記載されているため、このまま記載を続けるとapp.pyのコード量が肥大化します。
次回はファイルごとに役割分担を明確にしたFlaskアプリを作成するために、Flaskの機能であるBlueprintをこのアプリに導入していきます。
この記事は、VPSで作るPythonでのWebアプリ運用環境の連載記事です。
次は、12. Python(Flask)でMariaDB(MySQL)へ接続できるアプリをもっと読みやすく改良してみようです。