Pythonのwebフレームワークの簡単な機能をまとめる。
Pythonで簡単なwebサイトを作りたい場合、webフレームワークを使用すれば簡単に実装できる。
その手順を簡単に説明する。
詳しい説明を行う前にwebフレームワークの主な機能を整理しておく。
-
ルーティング・・・URLを解釈し、対応するサーバーにあるファイルを見つける。
-
テンプレート・・・サーバーにあるデータをHTMLページに流し込む。
-
認証と権限付与・・・ユーザー名、パスワード、パーミッション(許可)を処理する。
-
セッション・・・ユーザーがウェブサイトを観覧している時、一時的なデータストレージを保持する。
まず、簡単なwebフレームワークであるFlaskを紹介する。
FlaskはFacebook認証やデータベース統合など本格的なweb開発にも使用される機能を備えている。
まずはFlaskをインストールしてみよう。
pip install flask
まずは簡単なwebページを作ってみる
現在のディレクトリ内に表示したいindex.htmlを入れておこう。
./
├flask1.py
├index.html
Hello World!
from flask import Flask
app = Flask(__name__, static_folder='.', static_url_path='')
@app.route('/')
def home():
return app.send_static_file('index.html')
app.run(port=9999, debug=True)
そしてターミナルかウィンドウでからサーバーを実行する
python flask1.py
ブラウザに以下のURLを入力してホームページを出力してみよう。以下の様に表示されるはずだ。
http://127.0.0.1:9999/
Hello World!
runを呼び出す際、debugをTrueにしておくことにより、
サーバーコードでエラーが発生した時、どこで問題を起こしたのか詳細な情報を特別な書式で表示したページで返してくれる。
(ただ、本番環境ではdebug =Trueにしてはならない! サーバーについて多くの情報を漏らす危険性を考慮して)
続いてtemplatesというディレクトリを作成し、その中にFlask2.htmlを作成しよう。
./
├ flask1.py
├ index.html
├ templates/ flask2.html
flask2.htmlの内容は以下のようにしてみる
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Flask2 Sample</title>
</head>
<body>
Please enter your favorite food : {{favo_food}}
</body>
</html>
次にこのテンプレートを読み込んでthingにユーザーが渡してきた値を埋め込み、
HTMLファイルとしてユーザーのブラウザー画面にレンダリングするサーバーコードを記述する。
flask1.pyを以下のように書き換える。
from flask import Flask, render_template
app = Flask(__name__, static_folder='.', static_url_path='')
@app.route('/echo/<fb_food>')
def echo(fb_food):
return render_template('flask2.html', favo_food=fb_food)
app.run(port=9999, debug=True)
いつものようにflask1.pyを実行する。
python flask1.py
ブラウザに以下のURLを入力してホームページを出力してみよう。以下の様に表示されるはずだ。http://127.0.0.1:9999/echo/banana
Please enter your favorite food : banana
今回は@app.route('/')の代わりに@app.route('/echo/')を指定した。
よってURLではhttp://127.0.0.1:9999/echo/好きな食べ物 と指定してあげる必要がある。
次にtemplatesファイル内のflask2.htmlを以下のように編集しよう。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Flask2 Sample</title>
</head>
<body>
Please enter your favorite food : {{favo_food}}
Please enter your favorite drink : {{favo_drink}}
</body>
</html>
今回はhtml内に引数が2つ存在する。その指定方法は複数存在するが、その方法を2つ紹介する。
1つ目は単純にURL自体を拡張することによる手法だ。 以下のようにflask1.pyを書き換える。
from flask import Flask, render_template
app = Flask(__name__, static_folder='.', static_url_path='')
@app.route('/echo/<fb_food>/<fb_drink>')
def echo(fb_food, fb_drink):
return render_template('flask2.html', favo_food=fb_food, favo_drink=fb_drink)
app.run(port=9999, debug=True)
いつものようにflask1.pyをターミナル上で実行してあげると
python flask1.py
今回は以下のようにURLを指定する
http://127.0.0.1:9999/echo/banana/milk
すると
以下のように表示されるはずだ。
Please enter your favorite food : banana
Please enter your favorite drink : milk
2つ目は引数をGET引数として渡す手法である。
以下のようにflask1.pyを書き換える。
from flask import Flask, render_template, request
app = Flask(__name__, static_folder='.', static_url_path='')
@app.route('/echo/')
def echo():
fb_food = request.args.get('fb_food')
fb_drink = request.args.get('fb_drink')
return render_template('flask2.html', favo_food=fb_food, favo_drink=fb_drink)
app.run(port=9999, debug=True)
いつもの通り実行を行う。
python flask1.py
今回はURLを以下のように指定する。
http://127.0.0.1:9999/echo?fb_food=banana&fb_drink=milk
すると先ほどと同じ結果が得られる。
今回はURLに対してGETコマンドを実行した。
GETコマンドを指定してあげるとき、
?key1=vall&key2=val2...のような形で任意の引数渡すことができる。
ただし、引数名はpythonファイル内で
request.args.get('key1')
のような形で指定してあげる必要がある。