メジャーレンタルサーバエックスサーバーにpythonのマイクロフレームワークFlaskをインストールし、mySQLを操作してみました。
XサーバーでFlaskを運用するには、PHPのようにファイルを放り込んだら良いというものではありませんので、環境の構築のために、SSHでサーバ接続し、諸々の事前が準備が必要です。私の環境構築は、参考になるか分かりませんが、動画にしてあります。
Flaskは、2020年現在大人気のプログラミング言語pythonでWEBアプリケーションを構築するためのフレームワークです。pythonのWEBフレームワークとしては、FlaskとDjangoがよく知られているようですが、Flaskは小規模、Djangoは大規模向けのようです。Flaskは、学習する上でのハードルも低いようですので、私も日常の仕事があるため、学習時間は限られておりFlaskを学習することにしました。始めたばかいですが、pythonフレームワークFlask面白い!と感じましたね。
パッケージの確認
pythonおよびFlaskからmySQLを操作するために、いくつかのパッケージが必要です。Flask, Flask-MySQL, Jinja2, mysql-connector-pythonこのあたりのパッケージは必要ですので、無ければpip3 install でインストールしないといけません。下の画像のように、pip3 list で確認したところ、私のXサーバー環境は以下のパッケージをインストールしてあります。
アップロードするファイル
ドメイン直下のpublic_htmlにtest1/デイレクトリを作成し、3つのファイルをアップロードしました。
.htaccessと、index.cgi、pythonファイルであるindex.pyです。index.cgiの属性は755にします。
また、HTMLのテンプレートファイルを利用しますので、デイレクトリtemplateも作成し、その中に、HTMLのテンプレートファイルhello.html、kaiin.htmlをアップロードしました。次にファイルの中身を説明していきます。
.htaccess
1 2 3 4 5 6 |
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ /test1/index.cgi/$1 [QSA,L] <Files ~ "\.py$"> deny from all </Files> |
index.cgi
1 2 3 4 |
#! /home/XサーバのサーバーID/.linuxbrew/bin/python3 from wsgiref.handlers import CGIHandler from index import app CGIHandler().run(app) |
/home/XサーバのサーバーID/.linuxbrew/bin/python3はXサーバ内のpythonの格納されている場所を指しています。
それ以外は、定型文として、そのまま流用できます。
index.py
いよいよpythonファイルです。一行目のrender_templateは、テンプレートの呼び出しに使います。import mysql.connector はmySQLを利用するために必須です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
from flask import Flask, render_template import mysql.connector as mydb app = Flask(__name__) @app.route('/') def hello_world(): return "Hello world!" @app.route("/hello") def hello(): title="FlaskをレンタルサーバXserverで利用する!" subtitle="データベースmySQLのInsert,Update,Selectを実行する" return render_template('hello.html', title=title,subtitle=subtitle) if __name__ == "__main__": app.run(host='0.0.0.0') |
@app.route(‘/’) ブラウザアドレスバーがルートの場合の処理です。
URLとして、https://ドメイン/test1/ あるいは https://ドメイン/test1/index.cgi と打つと、下画像のようにHello world!が表示されます。
@app.route(“/hello”)
URLとして、https://ドメイン/test1/hello あるいは https://ドメイン/test1/index.cgi/hello と打つと、下画像のように表示されます。render_templateの名前通り、./templates/hello.htmlに引数として、titleとsubtitleを与えます。
hello.htmlの中身です。htmlファイルの中でpythonを使うことができます。PHPで言うところの<?= ?>のようなものでしょうか。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>{{ title }}</title> </head> <body> <div id="contents"> <h1 style="font-size: 16px;">{{ title }}</h1> <h2 style="font-size: 14px;">{{ subtitle }}</h2> </div> </body> </html> |
mysqlと接続、selectで一件のレコードを取得・表示
以下のようなテーブルを準備しておきます。フィールドはid,name,ageの三つのみです。
pythonファイル index.pyにmySQLと接続するための記述を3行目以降追記します。
MySQLユーザ、パスワード、MySQLが動いているサーバー、データベース名 の記述が必要です。
@app.route(“/select”)以下にURLが、https://ドメイン/test1/select と打たれた場合の処理を記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
from flask import Flask, render_template import mysql.connector as mydb # コネクションの作成 connector = mydb.connect( host='MySQLが動いているサーバー', user='MySQLユーザ', password='パスワード', database='データベース名', charset="utf8" ) app = Flask(__name__) @app.route('/') def hello_world(): return "Hello world!" @app.route("/hello") def hello(): title="FlaskをレンタルサーバXserverで利用する!" subtitle="データベースmySQLのInsert,Update,Selectを実行する" return render_template('hello.html', title=title,subtitle=subtitle) @app.route("/select") def select(): cursor = connector.cursor() sql = "SELECT `id`, `name`, `age` FROM kaiin_table WHERE id=103" cursor.execute(sql) result = cursor.fetchall() for row in result: return "id:" + str(row[0]) + " name:" + str(row[1]) + "さん age:" + str(row[2]) cursor.close() connector.close() if __name__ == "__main__": app.run(host='0.0.0.0') |
@app.route(“/select”)抜粋①カーソルを取得します②kaiin_tableのidが103の会員情報を取得するSQL文を実行します。③SQLの結果を配列にします。
URLとして、https://ドメイン/test1/select あるいは https://ドメイン/test1/index.cgi/select として打つと、下画像のように表示されます。
selectで全件のレコードを取得・配列のまま表示
@app.route(“/selects1”)以下にURLが、https://ドメイン/test1/selects1 と打たれた場合の処理を記述します。テーブルの全件のレコードを取得し、配列のままブラウザに表示させます。result = cursor.fetchall()で、SELECT文の結果を配列としてresultに格納しています。
1 2 3 4 5 6 7 8 9 |
@app.route("/selects1") def selects1(): cursor = connector.cursor() sql = "SELECT `id`, `name`, `age` FROM kaiin_table ORDER BY id" cursor.execute(sql) result = cursor.fetchall() return str(result) cursor.close() connector.close() |
URLとして、https://ドメイン/test1/selects1 と打つと、下画像のように表示されます。当たり前ですが、SQL文の結果が配列のまま表示されます。ちょっと退屈ですね。
selectで全件のレコードを取得・1レコードづつ表示
@app.route(“/selects2”)以下にURLが、https://ドメイン/test1/selects2と打たれた場合の処理を記述します。テーブルの全件のレコードを配列として取得し、要素を一つづつブラウザに表示させます。for文で配列の要素を順番に取り出しています。
1 2 3 4 5 6 7 8 9 10 11 12 |
@app.route("/selects2") def selects2(): cursor = connector.cursor() sql = "SELECT `id`, `name`, `age` FROM kaiin_table ORDER BY id" cursor.execute(sql) result = cursor.fetchall() moji = "" for row in result: moji = moji + "id:" + str(row[0]) + " name:" + str(row[1]) + "さん age:" + str(row[2]) + "<BR>" return moji cursor.close() connector.close() |
URLとして、https://ドメイン/test1/selects2 と打つと、下画像のように表示されます。面白くなってきましね。
selectで全件のレコードを取得・配列をテンプレートHTMLファイルに渡して、HTMLファイルで要素として一つづつ表示
@app.route(“/selects3”)以下にURLが、https://ドメイン/test1/selects3と打たれた場合の処理を記述します。テーブルの全件のレコードを取得し、配列のままテンプレートHTMLファイルkaiin.htmlに渡します。kaiin.htmlファイル内で、配列から要素を一つづつ順番に取り出し、ブラウザに表示させます。
1 2 3 4 5 6 7 8 9 10 |
@app.route("/selects3") def selects3(): cursor = connector.cursor() sql = "SELECT `id`, `name`, `age` FROM kaiin_table ORDER BY id" cursor.execute(sql) results = cursor.fetchall() return render_template('kaiin.html', kaiin=results) connector.commit() cursor.close() connector.close() |
kaiin.htmlの中身です。htmlファイルの中でpythonを使うことができます。for user in kaiin の箇所です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>会員テーブル</title> </head> <body> <div id="contents"> <p></p> <table border="1"> <tr> <th>ID</th> <th>Name</th> <th>Age</th> </tr> {% for user in kaiin %} <tr> <td>{{ user[0] }}</td> <td>{{ user[1] }}</td> <td>{{ user[2] }}</td> </tr> {% endfor %} </table> </div> </body> </html> |
URLとして、https://ドメイン/test1/selects3 と打つと、下画像のように表示されます。かなり、面白くなってきましたね?
update文で、会員情報を更新
@app.route(“/update”)以下にURLが、https://ドメイン/test1/updateと打たれた場合の処理を記述します。idが103の会員の年齢を更新します。update文を実行した後、connector.commit()をしないとデータが保存されないので、注意が必要です。
1 2 3 4 5 6 7 8 9 |
@app.route("/update") def db_update(): cursor = connector.cursor() sql = "UPDATE `kaiin_table` SET age=22 WHERE id=103" cursor.execute(sql) connector.commit() cursor.close() connector.close() return "update!" |
URLとして、https://ドメイン/test1/update と打つと、SQL文が実行、データベースに保存された後、updateと表示されます。
URLとして、https://ドメイン/test1/selects3 と打つと、更新を確認することができます。面白いです!
insert文で、会員情報を登録
@app.route(“/insert”)以下にURLが、https://ドメイン/test1/insertと打たれた場合の処理を記述します。山田花子をさんの情報を追加するためのinsert文を実行した後、connector.commit()をしないとデータが保存されないので、注意が必要です。
1 2 3 4 5 6 7 8 9 10 |
@app.route("/insert") def db_save(): cursor = connector.cursor() sql = "INSERT INTO `kaiin_table`(`name`, `age`) VALUES ('山田 花子','31')" cursor.execute(sql) connector.commit() cursor.close() connector.close() return "insert!" |
URLとして、https://ドメイン/test1/insert と打つと、SQL文が実行、データベースに保存された後、insertと表示されます。
URLとして、https://ドメイン/test1/selects3 と打つと、更新を確認することができます。面白いです!
2020年9月の四連休以降、時間を見つけてpythonというかFlask勉強していますが、とても面白いです!はまりそうです!