ここからは更に発展させてminimalapp 問い合わせフォームの作成概要を記載します
PRGパターン
PRGパターンは、Post Redirect Getの頭文字を繋いだものになります
これは、POSTメソッドでリクエストを受け取った場合、
そのメソッドの処理の終わりに必ずRedirectし、
処理後の結果はGetメソッドで呼び出せる画面に返しましょうというデザインパターンです
1.問い合わせフォーム 画面を表示する(GET)
2.問い合わせ内容を メールで送信する(POST)
3.問い合わせ完了 画面へリダイレクトする(REDIRECT)
4.問い合わせ完了 画面を表示する(GET)
リダイレクトとは、WebサイトやページのURLを変更した際
古いURLにアクセスしたユーザーを自動的に新しいURLに転送することをいいます
Webサイトをリニューアルした時やドメインの変更時
PCサイトとスマートフォン向けサイトで異なるURLを使用している時などに使用されます
リクエストとリダイレクト
リクエスト情報を取得するためには、
flask モジュールからリクエストオブジェクト request を
importします
別のエンドポイントにリダイレクトするにはredirect関数を使用します
問い合わせフォームのエンドポイントを作成する
apps/minimalapp/app.pyを調整し
問い合わせフォーム 画面を表示するエンドポイント
メールを送り 問い合わせ完了 画面を表示するエンドポイント
を追加します
エンドポイントの概要については以下を参照願います
# お問い合わせフォーム
@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>
ロギング
開発時や運用時に予期しないエラーが発生する場合が有ります
そのような際にはロガーが役に立ちます
flaskはpython標準のloggingモジュール を利用
便利なモジュールにflask-debugtoolbarが有ります
クッキー cookie
cookieは“Webサイトとユーザー間でやり取り・保存されるアクセス情報”のこと。
cookieを有効にしていると、ユーザーごとに割り振られた識別IDや氏名、電話番号、サイト訪問日時といった情報がユーザーのPCやスマホに保存されます。保存された情報は再度サイトにアクセスした際に自動的に呼び出され、サイト利用をスムーズにするために使われるのです。この仕組み自体がcookieと呼ばれることもあります。cookieで保存される情報は文字情報であるため、保存により端末の容量はほとんど圧迫されません。
cookieと混合されやすいとして挙げられるのが「キャッシュ」。キャッシュは「ブラウザで表示したページ自体のデータ」です。キャッシュを保存しておくと再度ページにアクセスした際の読み込み速度が早まり快適なネット利用につながります。
cookieは「ユーザーのアクセス情報」、キャッシュは「Webページ自体の情報」と区別して覚えておくと良いでしょう。
WebサーバーからWebブラウザへHTTPレスポンスのヘッダを利用して小さな情報を送る。
この情報は「名前=値」の組み合わせで表される。
Webアプリケーション側では、リクエスト•ヘッダに入っているCookieを調べることで、アクセスしてきた相手がどのような相手なのかを知ることができる。
セッション
セッションはWebブラウザを閉じるまで保存する
リンクなどを張ってページを移動しても内容を保持することができる
セッションが不要になった場合は、session_unsetファンクションを使ってセッションの内容を全て削除する。
例)ショッピングサイト
「このユーザーは誰か」→セッションIDで識別することが可能
「なにを買ったか」→セッション変数にデータをセット セッションが持続する間保持できる
•ショッピングサイトを移動する間は、サーバーに保存されているセッション情報を逐次取り出して、表示、更新する。
•商品を追加したときにはセッション変数に追加、カートから削除したときにはセッション変数から削除。
レスポンス
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