BottleのCookieの設定にはpathの設定が必要だった


やろうとしたこと

PythonのWEBフレームワーク Bottle でログイン機能をつくろうとした
具体的にいえば、ログインでユーザー認証後に Cookieuser_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_userNone か否かで判定しています。

原因

ログインの認証が通って、クッキーをセットしたときに 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 だとその辺設定しなくてよいので見落としていました。

参考にさせていただきました

Pythonで一番小さいWEBフレームワークbottle.py その6(COOKIES)