flask TypeError: 'ImmutableMultiDict' object is not callable

28,469

You have a syntax error here:

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

Instead it should be:

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

There are a few other instances of this so make sure you catch all of them. The reason this is an error is you are trying to call request.form with the string list ['email'] instead of indexing into the form.

if (user or password) is None: is also buggy. If either one is not None, then the block will not be triggered. However, I believe that the desired behavior is to require both. You could try either this:

if user is None or password is None:

or:

if None in [user, password]:
Share:
28,469

Related videos on Youtube

peterh
Author by

peterh

Truthful words are not beautiful; beautiful words are not truthful. (Lao Tze) The Last Question

Updated on January 23, 2021

Comments

  • peterh
    peterh about 3 years

    Can someone say what is wrong with this code? The error which I get:

    TypeError: 'ImmutableMultiDict' object is not callable

    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)
    

    And this is an html part:

    <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>
    
  • Admin
    Admin over 7 years
    Adam thank you so much. I just realized all errors after reading your comment. Again thanks, it was very helpful