4
1

More than 3 years have passed since last update.

FlaskのCookieをつかって「みる」~最小構成のテンプレートCookie~

Last updated at Posted at 2021-03-25

はじめに

Flaskで、ログインプログラムを作ろうと思った。でも、Cookieの使い方がよくわからなかった。調べてみても「最小限」の使い方は載っていなかった。だから最低限のCookieの使い方を書いてみた。

内容

cookieを使って「みたい」人のための最小のcookieの使い方

対象

cookieをFlaskで使ってみたいと思ったけど、理解できなかった人

Flaskの使い方がある程度わかる人

よくあるサンプルコードから使い方を知る

sample.py
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)
cookie.html

<!DOCTYPE html>
<html lang="ja">
<body>
    <p>cookieに値が格納されました。</p>
    <form action='/view'>
        <input type="submit" value="戻る">
    </form>
</body>
</html>
view.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分ほどで学習できると思う。
どんなことでも少しでも知っていると「できる!」とも思うし、「もっと勉強しよう!」とも思う。だから、本当に本当に最小の部分だけを書いた。もっと調べて、広い知識をつけるのに役立ったら嬉しいと思う。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1