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

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

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

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

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

# よくあるサンプルコードから使い方を知る
```python: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)
```

```html:cookie.html

<!DOCTYPE html>
<html lang="ja">
<body>
    <p>cookieに値が格納されました。</p>
    <form action='/view'>
        <input type="submit" value="戻る">
    </form>
</body>
</html>
```

```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の保存
```python
    max_age = 30
    expires = int(datetime.datetime.now().timestamp()) + max_age
```
ここの部分でcookieをいつまで保持するかを設定する。。max_ageを変えることで、時間を変更できる。

（単位は秒。この場合だと３０秒になる。したがって、３０秒後にページをリロードすると、「設定されていません」が表示される。）

```python
    response = make_response(render_template("cookie.html"))
```
レスポンスを作成する。。cookie.htmlで作成する。

```python
    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秒`

```python
    return response
```

responseを返す。htmlが表示され、cookieも保存される。

### cookieの読み込み

```python
    user_info = request.cookies.get('hoge')
```

user_infoのhogeという名前のcookieを読み込んで代入する。

```python
   if user_info is not None:
       user_info = json.loads(user_info)
   return render_template('view.html', user_info = user_info)
```
色々してからrender_templateをずる。。htmlを見ると、

```html
    {% if user_info == None %}
        <p>cookieが設定されていません。</p>
    {% else %}
        <p>id:{{user_info.id}}</p>
        <p>password:{{user_info.password}}</p>
    {% endif %}
```
もしuser_infoがカラなら

```html
 <p>cookieが設定されていません。</p>
 ```
 入っているなら

```html
<p>id:{{user_info.id}}</p>
<p>password:{{user_info.password}}</p>
```
辞書型のuser_infoのidとpasswordを表示するようになっている。

# 最小構成のテンプレートcookie（書き込み）
特に何も考えずに使えるようなテンプレを書いてみた。

```python
    import json
    import datetime
    max_time = 「１」
    expires = int(datetime.datetime.now().timestamp()) + max_time * 60
    response = make_response(render_template(「２」))
    user_info = 「３」
    response.set_cookie(「４」, value=json.dumps(user_info), expires=expires)
    return response
```
### 「１」の内容
保持する時間を「分」で書く。

### 「２」の内容
表示させるhtmlのファイル名を指定する。

### 「３」の内容
保存する内容を辞書型で記入する。

### 「４」の内容
保存するcookieの名前を記入する。

# 最小構成のテンプレートcookie（読み込み）
同じように特に何も考えずに使えるようなテンプレを書いた。

```python
    user_info = request.cookies.get(「１」)
    if user_info is not None:
        user_info = json.loads(user_info)
```
### 「１」の内容
取り出したいcookieの名前を書く。

### 出力
user_infoの中に辞書型でcookieの内容が入っている。

# 終わりに
「とりあえず」の部分を書いた。１０分ほどで学習できると思う。
どんなことでも少しでも知っていると「できる！」とも思うし、「もっと勉強しよう！」とも思う。だから、本当に本当に最小の部分だけを書いた。もっと調べて、広い知識をつけるのに役立ったら嬉しいと思う。