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?

6

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.

2

change 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.

1

For 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') 

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.