はじめに
Flaskで、ログインプログラムを作ろうと思った。でも、Cookieの使い方がよくわからなかった。調べてみても「最小限」の使い方は載っていなかった。だから最低限のCookieの使い方を書いてみた。
内容
cookieを使って「みたい」人のための最小のcookieの使い方
対象
cookieをFlaskで使ってみたいと思ったけど、理解できなかった人
Flaskの使い方がある程度わかる人
よくあるサンプルコードから使い方を知る
from flask import Flask, render_template, make_response, request
import json
import datetime
app = Flask(__name__)
@app.route('/resp')
def resp():
max_age = 30
expires = int(datetime.datetime.now().timestamp()) + max_age
response = make_response(render_template("cookie.html"))
user_info = {'id':'123', 'password':'user_password'}
response.set_cookie("hoge", value=json.dumps(user_info), expires=expires)
return response
@app.route('/view')
def view():
user_info = request.cookies.get('hoge')
if user_info is not None:
user_info = json.loads(user_info)
return render_template('view.html', user_info = user_info)
app.run(debug=True)
<!DOCTYPE html>
<html lang="ja">
<body>
<p>cookieに値が格納されました。</p>
<form action='/view'>
<input type="submit" value="戻る">
</form>
</body>
</html>
<!DOCTYPE html>
<html lang="ja">
<body>
<form>
<input type="submit" value="cookieを設定" formaction="/resp">
<input type="submit" value="更新" formaction="/view">
</form>
{% if user_info == None %}
<p>cookieが設定されていません。</p>
{% else %}
<p>id:{{user_info.id}}</p>
<p>password:{{user_info.password}}</p>
{% endif %}
</body>
</html>
全体の動き
「/view」の動き
cookieが設定されているときには、idとpasswordが、されていなければ「cookieが設定されていません。」が表示される。
「/view」のform
formの「cookieを設定」を押すと、「/resp」にジャンプする。
formの「更新」を押すと、ページがリロードされる。
「/resp」
cookieが設定される。そして「/view」へのボタンが表示される。
プログラムの解説
ここではプログラムを解説していこうと思う。
cookieの保存
max_age = 30
expires = int(datetime.datetime.now().timestamp()) + max_age
ここの部分でcookieをいつまで保持するかを設定する。。max_ageを変えることで、時間を変更できる。
(単位は秒。この場合だと30秒になる。したがって、30秒後にページをリロードすると、「設定されていません」が表示される。)
response = make_response(render_template("cookie.html"))
レスポンスを作成する。。cookie.htmlで作成する。
user_info = {'id':'123', 'password':'user_password'}
response.set_cookie("hoge", value=json.dumps(user_info), expires=expires)
辞書型で保存するデータを作成する。
そしてそれを、以下のようにしてレスポンスを編集(?)する。
Cookieの名前:hoge
内容:{'id':'123', 'password':'user_password'}
有効期限:30秒
return response
responseを返す。htmlが表示され、cookieも保存される。
cookieの読み込み
user_info = request.cookies.get('hoge')
user_infoのhogeという名前のcookieを読み込んで代入する。
if user_info is not None:
user_info = json.loads(user_info)
return render_template('view.html', user_info = user_info)
色々してからrender_templateをずる。。htmlを見ると、
{% if user_info == None %}
<p>cookieが設定されていません。</p>
{% else %}
<p>id:{{user_info.id}}</p>
<p>password:{{user_info.password}}</p>
{% endif %}
もしuser_infoがカラなら
<p>cookieが設定されていません。</p>
入っているなら
<p>id:{{user_info.id}}</p>
<p>password:{{user_info.password}}</p>
辞書型のuser_infoのidとpasswordを表示するようになっている。
最小構成のテンプレートcookie(書き込み)
特に何も考えずに使えるようなテンプレを書いてみた。
import json
import datetime
max_time = 「1」
expires = int(datetime.datetime.now().timestamp()) + max_time * 60
response = make_response(render_template(「2」))
user_info = 「3」
response.set_cookie(「4」, value=json.dumps(user_info), expires=expires)
return response
「1」の内容
保持する時間を「分」で書く。
「2」の内容
表示させるhtmlのファイル名を指定する。
「3」の内容
保存する内容を辞書型で記入する。
「4」の内容
保存するcookieの名前を記入する。
最小構成のテンプレートcookie(読み込み)
同じように特に何も考えずに使えるようなテンプレを書いた。
user_info = request.cookies.get(「1」)
if user_info is not None:
user_info = json.loads(user_info)
「1」の内容
取り出したいcookieの名前を書く。
出力
user_infoの中に辞書型でcookieの内容が入っている。
終わりに
「とりあえず」の部分を書いた。10分ほどで学習できると思う。
どんなことでも少しでも知っていると「できる!」とも思うし、「もっと勉強しよう!」とも思う。だから、本当に本当に最小の部分だけを書いた。もっと調べて、広い知識をつけるのに役立ったら嬉しいと思う。