I am developing a flask registration form, and I receive an error:
error 405 method not found.Code:
import os
# Flask
from flask import Flask, request, session, g, redirect, url_for, abort, \ render_template, flash, Markup, send_from_directory, escape
from werkzeug import secure_filename
from cultura import app
# My app
from include import User
@app.route('/')
def index(): return render_template('hello.html')
@app.route('/registrazione', methods=['POST'])
def registration(): if request.method == 'POST': username= request.form.username.data return render_template('registration.html', username=username) else : return render_template('registration.html')registration.html:
<html>
<head> <title>Form di registrazione </title> </head> <body> {{ username }} <form id='registration' action='/registrazione' method='post'> <fieldset > <legend>Registrazione utente</legend> <input type='hidden' name='submitted' id='submitted' value='1'/> <label for='name' >Nome: </label> <input type='text' name='name' id='name' maxlength="50" /> <br> <label for='email' >Indirizzo mail:</label> <input type='text' name='email' id='email' maxlength="50" /> <br> <label for='username' >UserName*:</label> <input type='text' name='username' id='username' maxlength="50" /> <br> <label for='password' >Password*:</label> <input type='password' name='password' id='password' maxlength="50" /> <br> <input type='submit' name='Submit' value='Submit' /> </fieldset> </form> </body> </html>when I visit localhost:5000/registrazione, I receive the error. What am I doing wrong?
8 Answers
This is because you only allow POST requests when defining your route.
When you visit /registrazione in your browser, it will do a GET request first. Only once you submit the form your browser will do a POST. So for a self-submitting form like yours, you need to handle both.
Using
@app.route('/registrazione', methods=['GET', 'POST']) should work.
2change name of method registration
@app.route('/registrazione', methods=['POST'])
def registrazione(): if request.method == 'POST': username= request.form.username.data return render_template('registration.html', username=username) else : return render_template('registration.html') Just for people reading on it now. You have to render the /registrazione first, befor you can access the form data. Just write.
@app.route("/registrazione") def render_registrazione() -> "html": return render_template("registrazione.html")before you define def registration(). Sequence is key. You can't access data before the even are available. This is my understanding of the problem.
1For the error 500 (internal server error) in
username = request.form.username write instead
username = request.args.get("username") Example of a flask app using wsgi with JQuery, Ajax and json:
activecalls.py
from flask import Flask, jsonify
application = Flask(__name__, static_url_path='')
@application.route('/')
def activecalls(): return application.send_static_file('activecalls/active_calls_map.html')
@application.route('/_getData', methods=['GET', 'POST'])
def getData(): #hit the data, package it, put it into json. #ajax would have to hit this every so often to get latest data. arr = {} arr["blah"] = [] arr["blah"].append("stuff"); return jsonify(response=arr)
if __name__ == '__main__': application.run()Javascript json, /static/activecalls/active_calls_map.html:
<script src="">
</script>
<script>
$.ajax({ //url : "", url : "", type: "POST", data : formData, datatype : "jsonp", success: function(data, textStatus, jqXHR) { //data - response from server alert("'" + data.response.blah + "'"); }, error: function (jqXHR, textStatus, errorThrown) { alert("error: " + errorThrown); }
});
</script>When you run this. The alert box prints: "stuff".
I was also getting this error, I was going through all of this documentation and trying to sort this out, but at the end it was a silly mistake.
Below code was generating the 405 Method Not Allowed error
import requests
import json
URL = ""
PARAMS = '{ "id":"111", "age":30, "city":"New Heaven"}'
response = requests.post(url = URL, json = PARAMS)
print(response.content)It was due to an extra / at the end of url, when I removed it, it was gone. The below update on the requesting URL fixed it
URL = ""
I was stuck over same issue, I am showing my Login page route as default route and when I try to submit with default route then I got the issue because I had configured POST request on login route but not on the default application route and when I had added the 'POST' method configuration for my default route too, everything is working as expected. The configuration I had done is as follows:
@routes.route("/", methods=['GET', 'POST'] )
@routes.route("/admin-login", methods=['GET', 'POST'])
def admin_login():
...Hope, this would help anyone facing the similar issue.
The url path and the handling method should be named the same.
To resolve this issue change registration() function name to registrazione()
@app.route('/registrazione', methods=['POST'])
def registrazione(): if request.method == 'POST': username= request.form.username.data return render_template('registration.html', username=username) else : return render_template('registration.html')