前回のcookieのチュートリアルでは、実際にどのように動作するのかいまいち理解できていませんでした。
動作するプログラムを組んで確かめてみよう
flaskチュートリアルで、「cookie」の項目を勉強しました。しかし、チュートリアルのプログラムではどのように動作しているのかいまいち理解できていなかったので、プログラムで確かめてみることにしました。
前回の記事はこちらをご参考ください。
こんな人の役に立つかも
・flaskでWebアプリ開発をしたい人
・flaskのcookieのプログラムを理解したい人
・flaskの「before_request」などの挙動を知りたい人
作成したWebアプリ
flaskのチュートリアルの「cookie」の項目で勉強をした「before_request」のプログラムをもとに、cookieをページに保存するというプログラムを検証してみます。
次のような「application.py」というプログラムを「myproject」フォルダの中に作成しました。
from flask import Flask, url_for, g
from markupsafe import escape
from flask import request
from flask import render_template
from flask import request, after_this_request
from flask import make_response
app = Flask(__name__)
#before_requestを指定するとリクエストの前処理
@app.before_request
def detect_user_name():
#「u_name」変数をcookieから取得する
print("before_request")
u_name = request.cookies.get('username')
print(u_name)
#cookieに「u_name」変数がない場合
if u_name is None:
print("uname is none")
u_name = "panda"
@after_this_request
def remember_uname(response):
print("after_this_request")
response.set_cookie('username', u_name)
return response
g.u_name = u_name
#indexページ
@app.route('/')
def index():
print("Index")
return "Index"
#テスト用にアクセスするためのURL
@app.route('/test/')
def test():
print("test")
return "TEST"
このWebアプリケーションでは、print文で処理の流れを追うことができるように作成指定ます。ターミナルでどのようにprintされているかをみることで、どの処理がどの順番で発生したかがわかるようになっています。(原始的です。)
検証用のブラウザについて
普段利用しているブラウザでは、cookieを消去すると色々と面倒になるため、今回はいつも利用していないsafariを利用しました。
いつも利用していないブラウザで検証を行うことで、気兼ねなくcookieを消去して開発を行うことができます。
「before_request」「after_this_request」の動作
早速実行してみました。
まず、開発用Webサーバーなどを立ち上げてWebアプリの準備を行います。
準備ができたら、まずは利用するブラウザのcookieを全て消去します。
そして、「localhost:5000」にアクセスしてみます。
ターミナルに次のようにprintが表示されました。
before_request
None
uname is none
Index
after_this_request
127.0.0.1 - - [19/Aug/2020 00:27:03] "GET / HTTP/1.1" 200 -
before_request
panda
127.0.0.1 - - [19/Aug/2020 00:27:03] "GET /favicon.ico HTTP/1.1" 404 -
そして、次に「localhost:5000/test/」にアクセスしてみます。
before_request
panda
test
127.0.0.1 - - [19/Aug/2020 00:28:29] "GET /test/ HTTP/1.1" 200 -
before_request
panda
127.0.0.1 - - [19/Aug/2020 00:28:29] "GET /favicon.ico HTTP/1.1" 404 -
「@app.before_request」の処理は、「@app.route」の処理の前に行われ、「@after_this_request」は、routeの処理を挟み込むように最後に実行されることがわかりました。
この処理を利用することで、変数のように、特定のcookieの中身がない時はcookieの中身を入れて、responseでcookieの設定を返す、という一連の処理ができていることが理解できます。
「@after_this_request」の処理は少し特殊なイメージがあって、引数に「response」をとり、returnに「response」をとるような形で利用できるようです。
ちょっと改造
Indexページにcookieから取得した値を表示するようにしてみました。
application.pyの「@app.route(‘/’)」を以下のように書き換えます。
@app.route('/')
def index():
resp = make_response(render_template("index.html", username=request.cookies.get('username')))
return resp
また、「templates」フォルダに次の内容の「index.html」を配置します。
<html>
<body>
<h1>{{ username }}</h1>
</body>
</html>
動作確認
safariのcookieを全て消去して、リロードします。ターミナルに次のように表示されます。
before_request
None
uname is none
after_this_request
127.0.0.1 - - [19/Aug/2020 00:47:57] "GET / HTTP/1.1" 200 -
before_request
panda
127.0.0.1 - - [19/Aug/2020 00:47:57] "GET /favicon.ico HTTP/1.1" 404 -
1回目、cookieの「username」がない時は、@app.route(‘/’)が実行された時点では、「username」に「None」が入っている状態です。HTML表示後、「after_this_request」で「username」に「panda」がセットされます。
もう一度safariをリロードしてみます。ターミナルには次のように表示されます。
before_request
panda
127.0.0.1 - - [19/Aug/2020 00:54:56] "GET / HTTP/1.1" 200 -
予想通り、cookieの「username」が表示されました。
今回、色々といじってみて、「render_template」を使ったり、HMTLテンプレートにJINJA2のタグを使ったりと、色々過去の復習もできて面白かったです。
ターミナル+print文という一番原始的な方法で色々試してみましたが、流れを追うことで少しだけflaskの仕組みがわかってきたように感じています。