Flask Error: "Method Not Allowed The method is not allowed for the requested URL"

Question:

I’m getting the following error whenever I try to submit data to my Flask form:

Method Not Allowed The method is not allowed for the requested URL.

I think the issue is in the return redirect(url_for('database')) I’m doing. I’ve also tried return render_template('database.html) too. I’m trying to call the database page once form entries have been submitted to the database.

Relevant parts of my code are as follows:

@app.route('/entry', methods=['GET', 'POST'])
def entry_page():
    if request.method == 'POST':
        date = request.form['date']
        title = request.form['blog_title']
        post = request.form['blog_main']
        post_entry = models.BlogPost(date = date, title = title, post = post)
        db.session.add(post_entry)
        db.session.commit()
        return redirect(url_for('database'))
    else:
        return render_template('entry.html')

@app.route('/database')        
def database():
    query = []
    for i in session.query(models.BlogPost):
        query.append((i.title, i.post, i.date))
    return render_template('database.html', query = query)

entry.html is…

THIS IS THE BLOG ENTRY PAGE

blog:
<html>
    <form action='/database' method = "post">
        date<input name = "date" type = "text" class="text">
        title<input name = "blog_title" type = "text" class="text">
        main<input name = "blog_main" type = "text" class="text">
        <input type = "submit">
    </form> 
</html>

and database.html…

THIS IS THE QUERY:

{{query}}
Asked By: Suraj Kapoor

||

Answers:

What is happening here is that database route does not accept any url methods.

I would try putting the url methods in the app route just like you have in the entry_page function:

@app.route('/entry', methods=['GET', 'POST'])
def entry_page():
    if request.method == 'POST':
        date = request.form['date']
        title = request.form['blog_title']
        post = request.form['blog_main']
        post_entry = models.BlogPost(date = date, title = title, post = post)
        db.session.add(post_entry)
        db.session.commit()
        return redirect(url_for('database'))
    else:
        return render_template('entry.html')

@app.route('/database', methods=['GET', 'POST'])        
def database():
    query = []
    for i in session.query(models.BlogPost):
        query.append((i.title, i.post, i.date))
    return render_template('database.html', query = query)
Answered By: Wondercricket

I had a similar problem when I deployed my Flask app in the IIS. Apparently, IIS does not accept route that include an underline (“_”). When I removed the underline, problem was resolved.

Answered By: Hossein

I also had similar problem where redirects were giving 404 or 405 randomly on my development server. It was an issue with gunicorn instances.

Turns out that I had not properly shut down the gunicorn instance before starting a new one for testing.
Somehow both of the processes were running simultaneously, listening to the same port 8080 and interfering with each other.
Strangely enough they continued running in background after I had killed all my terminals.
Had to kill them manually using fuser -k 8080/tcp

Answered By: sanskarsharma

I had the same problem, and my solving was to replace :

return redirect(url_for('index'))

with

return render_template('index.html',data=Todos.query.all())

in my POST and DELETE route.

Answered By: Valerian Ardelean

I think you forgot to add methods for your database function.

@app.route('/database', methods=['GET', 'POST']) 
def database():
    query = []
    for i in session.query(models.BlogPost):
        query.append((i.title, i.post, i.date))
    return render_template('database.html', query = query)
Answered By: Andrew

flask need to have enctype="" must be added in the form tag. Like below.

<html>
    <form action='/database' method = "post" enctype="multipart/form-data">
        date<input name = "date" type = "text" class="text">
        title<input name = "blog_title" type = "text" class="text">
        main<input name = "blog_main" type = "text" class="text">
        <input type = "submit">
    </form> 
</html>
Answered By: pavi

try to add methods

@app.route(‘/database’, methods=[‘GET’, ‘POST’])

Answered By: Spectrum

Maybe parallel to this error:
Say your endpoint is like the following:

    @app.route('/entry', methods=['GET', 'POST'])

Now if in your html the action attribute doesn’t match the endpoint mentioned, naturally, you’ve got an error:

    <!-- N.B. its `entri`; but it should be `entry`-->
    <form action="entri" method="post" class="">

It is obvious, but could be sneaky. Hope it helps someone.

Answered By: heschmat
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.