web-dev-qa-db-ja.com

flask TypeError: 'ImmutableMultiDict'オブジェクトは呼び出せません

こんにちはみんなこのコードの何が問題なのか誰かが言うことができますか?私が得るエラー:TypeError: 'ImmutableMultiDict'オブジェクトは呼び出せません

def login():
error = None
form = LoginForm(request.form)

if request.method == 'POST':
    viewer = User.query.filter_by(Group='viewer').first()
    admin = User.query.filter_by(Group='admin').first()
    staff = User.query.filter_by(Group='staff').first()
    user = User.query.filter_by(Email=request.form(['email'])).first()
    password = User.query.filter_by(Password=request.form(['password'])).first()
    if (user or password) is None:
        session['logged_in'] = False
        flash('Please write your username password')
    else:

                session['logged_in'] = True
                flash('You were logged in')
                if viewer:
                    return redirect(url_for('viewer'))
                Elif admin :
                    return redirect(url_for('admin'))
                Elif staff:
                    return redirect(url_for('employee'))

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

そしてこれはhtmlの部分です:

<form class="sa-innate-form" method="post">
                            {{ form.csrf_token }}
                            <label>Email Address</label>
                            <input type="text" name="email" value="{{ request.form.email }}">
                            <label>Password</label>
                            <input type="password" name="password" value="{{ request.form.password }}">
                            <button type="submit" value="submit">Sign In</button>
                            <a href="">Forgot Password?</a>
                        </form>
4
user7152587

ここに構文エラーがあります:

_user = User.query.filter_by(Email=request.form(['email'])).first()
_

代わりに、次のようになります。

_user = User.query.filter_by(Email=request.form['email']).first()
_

これには他にもいくつかの例があるので、それらすべてを必ずキャッチしてください。これがエラーである理由は、フォームにインデックスを付ける代わりに、文字列リスト_request.form_を使用して_['email']_を呼び出そうとしているためです。

if (user or password) is None:もバグがあります。どちらかがNoneでない場合、ブロックはトリガーされません。ただし、望ましい動作は両方を必要とすることだと思います。これを試すことができます:

_if user is None or password is None:
_

または:

_if None in [user, password]:
_
4