cookieについては、何気ない言葉として使ってましたが、プログラミングしたことがなかったです。
ゼロからWebアプリを作るとなると、必要になってくる知識ですね。
今回は、Flaskのクイックチュートリアルで、「Cookies」の項目を勉強しました。正直、このチュートリアルを読んだだけでは何をいっているのか全然理解できていません・・・とりあえず、cookieの復習や、チュートリアルを正直に読んでみることにしました。今回は得られるものが極端に少ないかもしれません、申し訳ないです・・・
チュートリアルページはこちらです。
Cookies
cookieについて復習
cookieは、「端末に保存しておくWebサイトのデータ」です。ユーザーの端末にWebサイト(Webアプリ)がデータを残しておくことで、状態を保存することができます。
ECサイトで一時的に決済を保留してカートに商品を残しておいても、次回ログイン時にまだカートに残っている、というような処理もできます。
チュートリアルでのプログラミング
cookieの機能を使うために、flaskでは「request」をimportする必要があります。
cookieを保存する
from flask import make_response
@app.route('/')
def index():
#①make_response()
resp = make_response(render_template(...))
#②set_cookie()
resp.set_cookie('username', 'the username')
#③return
return resp
cookieにデータを保存するときは、次の順番でプログラムを実行します。
①make_response()
②set_cookie()
③return
正直、このプログラムでは、実行の順番くらいしかわかりませんでした。
cookieを読み込む
cookieを読み込むときは、「request.cookies.get」メソッドで取得ができます。
from flask import request
@app.route('/')
def index():
username = request.cookies.get('username')
# use cookies.get(key) instead of cookies[key] to not get a
# KeyError if the cookie is missing.
今みてきたプログラムでは、「@app.route(‘/’)」に対してcookieの保存と取得を別々に行うプログラムでした。
実際には、初めてアクセスした時にはcookieの中身は何もない状態です。取得してない場合、あらかじめcookieに値を保存しなければいけません。
このような場合のプログラムの説明が次のチュートリアルに記載されています。(プログラムはこれだけでは動作しません、説明用のプログラムです。)
from flask import request, after_this_request
#before_requestを指定するとリクエストの前処理
@app.before_request
def detect_user_language():
#「language」変数をcookieから取得する
language = request.cookies.get('user_lang')
#cookieに「language」変数がない場合
if language is None:
#「language」を取得
language = guess_language_from_request()
# when the response exists, set a cookie with the language
@after_this_request
def remember_language(response):
response.set_cookie('user_lang', language)
return response
#gに「language」変数を代入(この処理は必ず実行される)
g.language = language
gはflaskのグローバル変数らしいのですが、詳細はまだ調べきれていません。
ここまでのcookieのチュートリアルでは、なんだか机上の空論的なイメージしか得ることができませんでした。
次回やってみたい課題
「@app.before_request」がどのタイミングで動作するのか、「@after_this_request」がどこのタイミングで動作するのか、という点が動かしてみないとわからないなと感じました。
次回は、実際に動作してタイミングが掴めるようなプログラムを考えてみることにします。