やろうとしたこと
PythonのWEBフレームワーク Bottle
でログイン機能をつくろうとした
具体的にいえば、ログインでユーザー認証後に Cookie
に user_id
を設定する。
app.py
@route('/')
def index():
user_id = request.get_cookie('user_id', secret=SECRET_KEY)
current_user = session.query(User).get(user_id) if user_id else None
return template('templates/index',url=url, current_user=current_user)
@route('/users/login', method='GET')
def login_get():
current_user = None
user_id = request.get_cookie('user_id', secret=SECRET_KEY)
redirect('/') if user_id
return template('templates/users/login', url=url, current_user=current_user)
@route('/users/login', method='POST')
def login_post():
current_user = None
email = request.POST.getunicode('email')
password = request.POST.getunicode('password')
verified_user = # ユーザー認証の処理
# 認証が通ればオブジェクトが入る
if verified_user is not None:
response.set_cookie('user_id', verified_user.id, secret=SECRET_KEY)
redirect('/')
else:
return template('templates/users/login', url=url, current_user=current_user)
つまづいたこと
ログイン認証が通ったら、ルートパスにリダイレクトするんですが、ルートパスでログインしているときの表示に切り替わらない。
※ current_user
が None
か否かで判定しています。
原因
ログインの認証が通って、クッキーをセットしたときに path
の設定も必要だったみたい。今回ログイン認証をして Cookie
をセットしたときのパスは以下になります。
app.py
@route('/users/login', method='POST')
def login_post():
そうなると、 user_id
変数が /users
のパスにセットされるみたいで /
のパスだと変数がとりだせないみたいです。知らんかった。
以下みたいに path
を設定するとできるようになりました。
app.py
@route('/users/login', method='POST')
def login_post():
# 略
if verified_user is not None:
response.set_cookie('user_id', verified_user.id, secret=SECRET_KEY, path='/')
ちゃんとパスもをセットしないとだめなんですね。Django
だとその辺設定しなくてよいので見落としていました。