Flaskについてまとめ8 問い合わせフォーム作成概要

https://qiita.com/TaichiEndoh/items/be649037de0733e2887e

ここからは更に発展させてminimalapp　問い合わせフォームの作成概要を記載します

# PRGパターン

PRGパターンは、Post Redirect Getの頭文字を繋いだものになります
これは、POSTメソッドでリクエストを受け取った場合、
そのメソッドの処理の終わりに必ずRedirectし、
処理後の結果はGetメソッドで呼び出せる画面に返しましょうというデザインパターンです


https://zenn.dev/imah/articles/3d186a6462ecc8

1.問い合わせフォーム　画面を表示する（GET）
2.問い合わせ内容を　メールで送信する（POST）
3.問い合わせ完了　画面へリダイレクトする（REDIRECT）
4.問い合わせ完了　画面を表示する（GET）

https://gmotech.jp/semlabo/seo/blog/url_redirect/

リダイレクトとは、WebサイトやページのURLを変更した際
古いURLにアクセスしたユーザーを自動的に新しいURLに転送することをいいます

Webサイトをリニューアルした時やドメインの変更時
PCサイトとスマートフォン向けサイトで異なるURLを使用している時などに使用されます

# リクエストとリダイレクト
リクエスト情報を取得するためには、
flask モジュールからリクエストオブジェクト　request　を
importします

別のエンドポイントにリダイレクトするにはredirect関数を使用します

https://panda-clip.com/flask-requestobject/

# 問い合わせフォームのエンドポイントを作成する
apps/minimalapp/app.pyを調整し

問い合わせフォーム　画面を表示するエンドポイント
メールを送り　問い合わせ完了　画面を表示するエンドポイント

を追加します

エンドポイントの概要については以下を参照願います

https://wa3.i-3-i.info/word18427.html


```
# お問い合わせフォーム
@app.route("/contact")
def contact():
    return render_template("contact.html")


@app.route("/contact/complete", methods=["GET", "POST"])
def contact_complete():
    if request.method == "POST":
```

その後問い合わせフォームと　問い合わせ完了の画面　htmlを作成します


問い合わせフォーム
apps/minimalapp/templates/contact.html
```
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8" />
    <title>CEML 問い合わせフォーム</title>
    <link rel="stylesheet" href="{{ url_for('static', filename='style.css' ) }}" />
</head>

<body>
    <h2>CEML 問い合わせフォーム</h2>

    {% with messages = get_flashed_messages() %}
    {% if messages %}
    <ul>
        {% for message in messages %}
        <li class="flash">{{ message }}</li>
        {% endfor %}
    </ul>
    {% endif %}
    {% endwith %}
    <form action="{{ url_for('contact_complete') }}" method="POST" novalidate="novalidate">
        <table>
            <tr>
                <td>ユーザ名</td>
                <td>
                    <input type="text" name="username" value="{{ username }}" placeholder="ユーザ名" />
                </td>
            </tr>
            <tr>
                <td>メールアドレス</td>
                <td>
                    <input type="text" name="email" value="{{ email }}" placeholder="メールアドレス" />
                </td>
            </tr>
            <tr>
                <td>問い合わせ内容</td>
                <td>
                    <textarea name="description" placeholder="問い合わせ内容">{{ description }}</textarea>
                </td>
            </tr>
        </table>
        <input type="submit" value="問い合わせ" />
    </form>
</body>

</html>

```

問い合わせ完了フォーム
apps/minimalapp/templates/contact.html
```
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8" />
    <title>問い合わせ完了</title>
    <link rel="stylesheet" href="{{ url_for('static', filename='style.css' ) }}" />
</head>

<body>
    <h2>問い合わせ完了</h2>

    {% with messages = get_flashed_messages() %}
    {% if messages %}
    <ul>
        {% for message in messages %}
        <li>{{ message }}</li>
        {% endfor %}
    </ul>
   ｛% endif %}
    {% endwith %}
</body>

</html>
```
# ロギング
開発時や運用時に予期しないエラーが発生する場合が有ります
そのような際にはロガーが役に立ちます

https://wa3.i-3-i.info/word1689.html

https://software.fujitsu.com/jp/manual/manualfiles/M060001/J2S19680/01Z2A/sff02/sff00066.html

flaskはpython標準のloggingモジュール を利用

便利なモジュールにflask-debugtoolbarが有ります

https://toricor.hatenablog.com/entry/2016/02/03/215222


https://uokada.hatenablog.jp/entry/2012/12/03/111818


# クッキー　cookie

cookieは“Webサイトとユーザー間でやり取り・保存されるアクセス情報”のこと。

cookieを有効にしていると、ユーザーごとに割り振られた識別IDや氏名、電話番号、サイト訪問日時といった情報がユーザーのPCやスマホに保存されます。保存された情報は再度サイトにアクセスした際に自動的に呼び出され、サイト利用をスムーズにするために使われるのです。この仕組み自体がcookieと呼ばれることもあります。cookieで保存される情報は文字情報であるため、保存により端末の容量はほとんど圧迫されません。

cookieと混合されやすいとして挙げられるのが「キャッシュ」。キャッシュは「ブラウザで表示したページ自体のデータ」です。キャッシュを保存しておくと再度ページにアクセスした際の読み込み速度が早まり快適なネット利用につながります。

cookieは「ユーザーのアクセス情報」、キャッシュは「Webページ自体の情報」と区別して覚えておくと良いでしょう。

https://data.wingarc.com/what-is-cookie-23546


WebサーバーからWebブラウザへHTTPレスポンスのヘッダを利用して小さな情報を送る。
この情報は「名前=値」の組み合わせで表される。

Webアプリケーション側では、リクエスト•ヘッダに入っているCookieを調べることで、アクセスしてきた相手がどのような相手なのかを知ることができる。



# セッション

https://qiita.com/hththt/items/07136ad74127999df271

セッションはWebブラウザを閉じるまで保存する
リンクなどを張ってページを移動しても内容を保持することができる
セッションが不要になった場合は、session_unsetファンクションを使ってセッションの内容を全て削除する。
例)ショッピングサイト

「このユーザーは誰か」→セッションIDで識別することが可能
「なにを買ったか」→セッション変数にデータをセット セッションが持続する間保持できる

•ショッピングサイトを移動する間は、サーバーに保存されているセッション情報を逐次取り出して、表示、更新する。

•商品を追加したときにはセッション変数に追加、カートから削除したときにはセッション変数から削除。


# レスポンス

https://thinkami.hatenablog.com/entry/2017/04/17/210421


```

from flask import(
  make_response,
  session)

def contact():
    # レスポンスオブジェクトを取得する
    response = make_response(render_template("contact.html"))

    # クッキーを設定する
    response.set_cookie("flaskbook key", "flaskbook value")

    # セッションを設定する
    session["username"] = "ichiro"

    # レスポンスオブジェクトを返す
    return response

```