4

Flask-Login フレームワークを認証に使用するのが困難です。ドキュメントをできる限り徹底的に調べましたが、明らかな何かが欠けているようです。

class User():
    def __init__(self, userid=None, username=None, password=None):
        self.userid = userid
        self.username = username
        self.password = password

    def is_authenticated(self):
        return True

    def is_active(self):
        return True

    def is_anonymous(self):
        return False

    def get_id(self):
        return unicode(self.userid)

    def __repr__(self):
        return '<User %r>' % self.username

def find_by_username(username):
    try:
        data = app.mongo.db.users.find_one_or_404({'username': username})

        user = User()
        user.userid = data['_id']
        user.username = data['username']
        user.password = data['password']
        return user

    except HTTPException:
        return None


def find_by_id(userid):
    try:
        data = app.mongo.db.users.find_one_or_404({'_id': userid})
        user = User(data['_id'], data['username'], data['password'])
        return user

    except HTTPException:
        return None

上記は、にある私の User クラスですusers/models.py

login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'users.login'

@login_manager.user_loader
def load_user(userid):
return find_by_id(userid)

上記は私のユーザーローダーです。

@mod.route('/login/', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        pw_hash = hashlib.md5(form.password.data).hexdigest()
        user = find_by_username(form.username.data)
        if user is not None:
            if user.password == pw_hash:
                if login_user(user):
                    flash('Logged in successfully.')
                    return redirect(request.args.get('next') or url_for('users.test'))
                else:
                    flash('Error')

        else:
            flash('Username or password incorrect')

    else:
        flash('Username or password incorrect')

return render_template('users/login.html', form=form)

明らかなエラー メッセージはありませんが、 で装飾されたビューにアクセスしようとすると@login_required、ログイン フォームにリダイレクトされます。私が知る限り、login_user関数は実際には機能していませんがTrue、呼び出したときに返されます。アドバイスをいただければ幸いです。

4

3 に答える 3

1

それがあなたのlogin_user機能ではないことを確認した場合、それはあなたの機能を離れますfind_by_id

のソースコードは次のようにuser_loader述べています。

設定した関数は、ユーザー ID (a unicode) を受け取り、ユーザー オブジェクトを返すNone必要があります。ユーザーが存在しない場合は、ユーザー オブジェクトを返します。

あなたのfind_by_id関数はfind_one_or_404眉を上げます。その関数の周りに追加のデバッグを追加し、いくつかの出力を追加するか、ログを記録して、正しいユニコード ID で呼び出されていることを示し、UserオブジェクトまたはNone.

うまくいけば、問題の絞り込みに近づくでしょう。

于 2013-06-13T14:07:57.657 に答える