Reputation: 1715
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}}
Upvotes: 55
Views: 241361
Reputation: 3
Took me almost 5 hours and the solution for me is simply just specify the method first, then the action.
<form method = "post" action='/database'>
Upvotes: 0
Reputation: 113
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.
Upvotes: 1
Reputation: 11
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>
Upvotes: 1
Reputation: 406
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.
Upvotes: 1
Reputation: 159
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)
Upvotes: 10
Reputation: 373
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
Upvotes: 0
Reputation: 93
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.
Upvotes: 6
Reputation: 7872
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)
Upvotes: 66