flask_loginをうまく使いこなしたい

02/10/2021

A8バナー広告

Flaskにはflask-loginというサブパッケージがある。このパッケージを使うと、login/logout処理が簡単にできる・・・のだそうだ。でもうまくいかなかったので、解決のためにやったことを書いていく

つまずいたところ

  • current_userという属性にはログイン済みのユーザー情報が格納されている。
    • でも、current_userの呼び出しがうまくいかなかった
  • helper関数を少し書き換えたらうまくいった

基本的な使い方

Qiitaにいい記事があった。基本的にこの記事を見て実装すれば良いと思う。

でもこの記事を見て実装した

何が問題だったのか?

current_userを呼び出ししようとすると、なぜかAnonymousUserMixinが呼び出しされてしまう。
current_userにくっついてる属性を呼び出ししようとすると、AnonymousUserMixinに存在しない属性なので、エラーになってしまう。

ちなみに初期状態のhelper関数は次の通り。

状況を調べてみると、次の通りだった。

  • current_userにAnonymousUserMixinオブジェクトがセットされる。
  • load_user関数の中で、email引数には確実にログインユーザーの情報が渡されている。
  • でも、User.query.get(str(email)) がNoneを返している。

これは奇妙。

調べてみると、Qiitaにまた回答記事があった。解決策として次の通りにすればよかった。

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が邪魔をしていたのかもしれない。