flask_loginをうまく使いこなしたい
flaskにはflask-loginというサブパッケージがある。このパッケージを使うと、login/logout処理が簡単にできる・・・のだそうだ。でもうまくいかなかったので、解決のためにやったことを書いていく
目次
つまずいたところ
- current_userという属性にはログイン済みのユーザー情報が格納されている。
- でも、current_userの呼び出しがうまくいかなかった
- helper関数を少し書き換えたらうまくいった
基本的な使い方
Qiitaにいい記事があった。基本的にこの記事を見て実装すれば良いと思う。
でもこの記事を見て実装した
何が問題だったのか?
current_userを呼び出ししようとすると、なぜかAnonymousUserMixinが呼び出しされてしまう。
current_userにくっついてる属性を呼び出ししようとすると、AnonymousUserMixinに存在しない属性なので、エラーになってしまう。
ちなみに初期状態のhelper関数は次の通り。
1 2 3 |
@login_manager.user_loader def load_user(email): return User.query.get(str(email)) |
状況を調べてみると、次の通りだった。
- current_userにAnonymousUserMixinオブジェクトがセットされる。
- load_user関数の中で、email引数には確実にログインユーザーの情報が渡されている。
- でも、User.query.get(str(email)) がNoneを返している。
これは奇妙。
調べてみると、Qiitaにまた回答記事があった。解決策として次の通りにすればよかった。
Userオブジェクトからオブジェクトを生成できないのだそうだ。
1 2 3 4 |
@login_manager.user_loader def load_user(email): user = db.session.query(User).filter(User.email == email).first() return user |
調べている時についでに見つけたこと
flashメソッド
flashの使い方。便利。紹介記事。
flashメソッドを使うと、わざわざメッセージ表示処理を自分で実装しなくても良くなる。
Blueprintとcurrent_user
以下、勘違いしていたこと。blueprintの中でcurrent_userを経由してユーザー情報が取得できると思っていた。
例えばAuth関係が別のスクリプトに blueprint を使っていた場合にこういう欲求が湧いてくる。
Stackoverflowにそれらしき回答があった。
この説明だと、関数がmain appを読んでくれて、login managerに渡してくれている?と思った。
で、この通りにしてみたのだが、
Missing user_loader or request_loader. Refer to
というエラーが頻発する。意味がわからない。。
で、結局のところblue_printの中で定義してたlogin managerを消したらうまくいった。
blue_printの中のlogin managerが邪魔をしていたのかもしれない。
ディスカッション
コメント一覧
まだ、コメントがありません