5. WebでのリクエストURLによる処理の振り分け(PythonのFlaskを使用)

この演習では,Webサーバとデータベースの連携について説明する.前回の授業で扱ったMySQL Employees Sampleデータベースを使用する.

Webサーバ

Webサーバは,Webブラウザ等からの要求に対して,返答を返す.返答はHTMLであったり,他のオブジェクトであったりする.

Webサーバのポート番号

Webサーバの起動時には,通信に使うポート番号を指定できる.この演習では,ポート番号8080を指定する.

リクエストのルーティング

Webサーバに送られたURLに応じて処理を変えたいとする.例えば,Webブラウザで「http://localhost/db」としたときには「welcome」を,「http://localhost/db/hoge」としたときには「hoge」を表示したいとする.

このとき,次のようなプログラムを書く.

# -*- coding: utf-8 -*-

from flask import Flask

app = Flask(__name__)

@app.route('/db')
def tables():
    return 'welcome'

@app.route('/db/hoge')
def hoge():
    return 'hoge'

app.run(host='localhost', port=8080, debug=True)

■ SQLite3でのテーブル一覧取得

SQLite3でテーブル一覧を取得したいときは,次のようなSQL文を書く.

SELECT name FROM sqlite_master WHERE type='table';

演習準備

この演習では Python を使用する。Python がインストールされていない場合は,下記の「Python 3.12 のインストール(Windows 上)」を展開し,手順に従いインストールすること。下記の「必要なライブラリのインストール」を実施すること。

Python 3.12 のインストール(Windows 上) [クリックして展開]

以下のいずれかの方法で Python 3.12 をインストールする。Python がインストール済みの場合、この手順は不要である。

方法1:winget によるインストール

管理者権限コマンドプロンプトで以下を実行する。管理者権限のコマンドプロンプトを起動するには、Windows キーまたはスタートメニューから「cmd」と入力し、表示された「コマンドプロンプト」を右クリックして「管理者として実行」を選択する。

winget install -e --id Python.Python.3.12 --scope machine --silent --accept-source-agreements --accept-package-agreements --override "/quiet InstallAllUsers=1 PrependPath=1 AssociateFiles=1 InstallLauncherAllUsers=1"

--scope machine を指定することで、システム全体(全ユーザー向け)にインストールされる。このオプションの実行には管理者権限が必要である。インストール完了後、コマンドプロンプトを再起動すると PATH が自動的に設定される。

方法2:インストーラーによるインストール

  1. Python 公式サイト(https://www.python.org/downloads/)にアクセスし、「Download Python 3.x.x」ボタンから Windows 用インストーラーをダウンロードする。
  2. ダウンロードしたインストーラーを実行する。
  3. 初期画面の下部に表示される「Add python.exe to PATH」に必ずチェックを入れてから「Customize installation」を選択する。このチェックを入れ忘れると、コマンドプロンプトから python コマンドを実行できない。
  4. 「Install Python 3.xx for all users」にチェックを入れ、「Install」をクリックする。

インストールの確認

コマンドプロンプトで以下を実行する。

python --version

バージョン番号(例:Python 3.12.x)が表示されればインストール成功である。「'python' は、内部コマンドまたは外部コマンドとして認識されていません。」と表示される場合は、インストールが正常に完了していない。

演習

■ 前準備

・MySQL Employees Sampleデータベース

MySQL Employees Sampleデータベースの出典と著作権表示

出典:MySQL employees sample database https://dev.mysql.com/doc/employee/en/

=== This work is licensed under the Creative Commons Attribution-Share Alike 3.0 Unported License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA. Please contact http://www.mysql.com/about/contact/ for more information.

■ ステップ1

IPythonコンソールで,次のPythonプログラムを実行しなさい.

SQLite3データベースに接続する.

◆ 今日の演習ではSQLite3データベースファイル名はc:\hoge3.sqlite

■ ステップ2

エディタを使う.

  1. File -> New file…と操作する.
  2. エディタで,「print(1 + 2)」と書いてみる.
  3. 実行ボタンをクリックする.

結果を確認する.

■ ステップ3

  1. エディタで次のプログラムを記述する.
from flask import Flask

app = Flask(__name__)

@app.route('/db')
def tables():
    return 'welcome'

app.run(host='localhost', port=8080, debug=True)
  1. ファイルを書き換えたので,File -> Saveと操作する.
  2. 実行ボタンをクリックする.
  3. コンソールにエラーメッセージが出ていないことを確認する.
  4. Webブラウザを開き,http://localhost:8080/db を指定するとwelcomeと表示される.

※ Windowsでうまく動かない場合

ファイアウォールが設定されている可能性がある.次の手順で,ポート番号8080に関するファイアウォールを解除してみる.

■ ステップ4

  1. ファイルを書き換えて,File -> Saveと操作する.
  2. Webブラウザで,http://localhost:8080/db を指定すると,今度は,hogeと表示される.

■ ステップ5

  1. エディタで次のプログラムを記述する.
from flask import Flask
import sqlite3
import pandas

app = Flask(__name__)

@app.route('/db')
def tables():
    c = sqlite3.connect('c:\\hoge3.sqlite')
    df = pandas.read_sql("SELECT * FROM sqlite_master WHERE type='table';", c)
    c.close()
    return '<pre>%s</pre>' % str(df)

app.run(host='localhost', port=8080, debug=True)
  1. ファイルを書き換えたので,File -> Saveと操作する.
  2. 先ほど起動したWebサーバがまだ動いている場合は,「Ctrl + C」で停止する.
  3. Webブラウザを開き,http://localhost:8080/db を指定するとテーブル一覧が表示される.

■ ステップ6

  1. エディタで次のプログラムを記述する.
from flask import Flask
import sqlite3
import pandas

app = Flask(__name__)

@app.route('/db')
def tables():
    c = sqlite3.connect('c:\\hoge3.sqlite')
    df = pandas.read_sql("SELECT * FROM sqlite_master WHERE type='table';", c)
    c.close()
    return '<pre>%s</pre>' % str(df)

@app.route('/db/departments')
def departments():
    c = sqlite3.connect('c:\\hoge3.sqlite')
    df = pandas.read_sql("SELECT * FROM departments;", c)
    c.close()
    return '<pre>%s</pre>' % str(df)

app.run(host='localhost', port=8080, debug=True)
  1. ファイルを書き換えたので,File -> Saveと操作する.
  2. 先ほど起動したWebサーバがまだ動いている場合は,「Ctrl + C」で停止する.
  3. Webブラウザを開き,http://localhost:8080/db/departments を指定するとデータが表示される.