Python: python2.7でクッキーの概要
python2.7でクッキーを実装してみましたよ、のメモ書きです。
- ユーザがブラウザでユーザ名とパスワードを入力できるようHTMLを準備します。
- 入力されたユーザ名とパスワードをサーバ側でpythonにより取得します。
- ユーザ名とパスワードをクッキーに保存するようサーバー側でpythonからブラウザに命令します。
- 2回目以降のアクセスの際は、サーバー側で先にクッキーがないかを確認するようにします。
- 実際の実装例。
Python: HTMLでユーザ名とパスワード入力用フォームの作成
HTMLでユーザ名とパスワード入力用のページを準備します。
<!-- ログインページの次に「next_page.py」に飛ぶ想定です。 -->
<form action='./next_page.py' method='post'>
<!-- ユーザ名入力用のフォーム作成 -->
<input type='text' id='form_username' name='form_username' placeholder='ユーザ名'/>
</br>
<!-- パスワード入力用のフォーム作成 -->
<input type='password' id='form_password' name='form_password' placeholder='パスワード'/>
<input type="submit" name="button1" value="ログイン">
</form>
Python: サーバー側でユーザが入力したユーザ名とパスワードを取り出す。
今回は、サーバー側でCGIをpythonで動かしました。
pythonのコードで、ユーザが入力してきたユーザ名とパスワードを取り出します。
import cgi
form = cgi.FieldStorage()
if form.has_key("form_username"): #「form_username」は、上記のHTMLコードformタグ内のidです。
f_name=form['form_username'].value
username = f_name
else:
pass
if form.has_key("form_password"): #「form_password」は、上記のHTMLコードformタグ内のidです。
f_pw=form['form_password'].value
password = f_pw
else:
pass
Python: サーバー側で、クッキーに保存するHTMLを出力
ユーザが入力してきたユーザ名とパスワードを、ブラウザにクッキーとして保存するようにサーバー側でJavaScriptのコードを出力します。
print('''
<script>
document.cookie = "user01={}";
document.cookie = "pass01={}";
</script>
'''.format(f_name,f_pw))
「user01」と「pass01」の箇所は、自分の好きな名前でOKです。
Python: サーバー側で、クッキーに保存されたデータがないか確認する。
ユーザが既にログインを行っていることを想定して、クッキーに保存されたユーザ名とパスワードがないかを確認します。
import os
import Cookie
cookie = Cookie.SimpleCookie()
cookie.load(os.environ.get("HTTP_COOKIE",""))
# cookieの取得
# 指定したキーが存在しない場合(該当キーのクッキーがない場合)は、キーエラーになります。
try:
cookie_name=cookie["user01"].value
cookie_pw=cookie["pass01"].value
username = cookie_name
password = cookie_pw
except KeyError:
cookie_name="nocookie"
cookie_pw="nocookie"
Python: 実際の実装の順番
こんな順番で実装してみましたよ、の例です。
- 既に保存されているcookieがないか確認します。
- 保存されているcookieがなければ、送信されたフォーム内容の取得を実施。
- ユーザ名とパスワードを検証してOKであれば、クッキーに保存。
# 実装例
try:
クッキー取得
except:
if ユーザがユーザ名/パスワードを送信してきた:
ユーザ名/パスワード取得
ユーザ名とパスワードを検証
if 検証結果がOK:
クッキーに保存
else 検証結果がNG:
ユーザ名/パスワードを再入力するように催促
else ユーザがユーザ名/パスワードを送信してない:
ユーザ名/パスワードを入力するように催促