昨日いちにち本と首っ引きで作業したがやはりどこかおかしく、うまく動作しない。
今日はちょっとアプローチを変えてやってみよう。あと、作業を逐一記録しないとホントわけがわからなくなる。
Login-managerの登録をapp/__init__.pyに追記
login_manager = LoginManager() login_manager.login_view = "login" login_manager.init_app(app)
ここでこの書式につてちょっと確認。__init__.pyの中でこれまで
from flask import Flask app = Flask(__name__) from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy(app)
こういう書き方をしてきたのだが、もう一つ書き方があって
from flask import Flask from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() def create_app(): app = Flask(__name__) db.init_app(app) return app
こういうのだね。最初に上げたlogin_managerの書式はどちらかと言うと2つ目の書き方(それも若干簡略化されている?)のようなので、自分のこれまでの書式に統一するなら
login_manager = LoginManager(app) login_manager.login_view = "login"
こういうのを__init__.pyに追加しておくべきなんだと思う。それにLoginManagerもimportしておかないとならないんじゃないかな。
from flask_login import LoginManager login_manager = LoginManager(app) login_manager.login_view = "login"
これでlogin_manager.login_viewにログインページのviewを指定したことになるらしい。
つぎにユーザークラスの定義。app/models.pyのclass User(db.Model)に
def is_authenticated(self): return True def is_active(self): return True def is_anonymous(self): return False def get_id(self): return self.username
を追加しておく。
これでanonymousではログインできないなどの基本ルールが与えられる。
と、ここまでは
https://www.osstech.co.jp/~hamano/posts/flask-login-ldap/
こちらのページを参考にしていたがここで解説されている方法はLDAPサーバを用いた認証で、SQLだとちょっと勝手が違う部分があるようだ。LDAPを使っても問題はないんだが、どうしたものか。SQLと冗長になるのはこの際気にせず、まずはLDAPでのユーザー認証で動作することを確認し、SQLに移行することを目指すといいだろうか。LDAPでユーザー管理すると、他のwebアプリ(redmineとか)とも一括管理ができるらしいので、案外いいのかもしれない。
ただ、どうやらFlask-LDAPがpython3に未対応なようで、pip3 installでエラーが出てインストールさせてもらえないみたい。
flask-ldap3-loginというパッケージは対応しているようだけど、これでいけるんだろうか?
https://pypi.python.org/pypi/flask-ldap3-login/0.9.1
ユーザー処理はややこしい上にセキュリティー上とても重要なので、あまり自己流であれやこれや悩むのは良くないだろう。
なので、例題のフルコピーをまずはやってみることだ。
- メールによるユーザ確認
ユーザ登録でよく使われるパターンだな。メールアドレスを入力してsubmitするとそのアドレスにメールが届き、記載されたアドレスにアクセスすると登録が完了するというあれだ。