web-dev-qa-db-fra.com

Erreur de flacon de méthode non autorisée 405

Je développe un formulaire d’inscription de flacon et j’obtiens une erreur:

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>

lorsque je visite localhost:5000/registrazione, je reçois le message d'erreur. Qu'est-ce que je fais mal?

14
Matteo

En effet, vous autorisez uniquement les demandes POST lors de la définition de votre itinéraire.

Lorsque vous visitez /registrazione dans votre navigateur, une requête GET est effectuée en premier. Une fois que vous avez envoyé le formulaire, votre navigateur effectue un POST. Donc, pour un formulaire à soumission automatique comme le vôtre, vous devez gérer les deux.

En utilisant 

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

devrait marcher.

41
Lukas Graf

Exemple d'application de flacon utilisant wsgi avec JQuery, Ajax et 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 __== '__main__':
    application.run()

Javascript json, /static/activecalls/active_calls_map.html:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>

<script>
$.ajax({
    //url : "http://dev.consumerunited.com/wsgi/activecalls.py/_getData",
    url : "activecalls.py/_getData",
    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>

Quand vous courez ça. La boîte d’alerte affiche: "matériel".

1
Eric Leschinski

Juste pour les personnes qui lisent dessus maintenant . Vous devez d'abord rendre le/registrazione, avant de pouvoir accéder aux données du formulaire. Ecrivez.

@app.route("/registrazione")
    def render_registrazione() -> "html":
        return render_template("registrazione.html")

avant de définir def registration (). La séquence est la clé. Vous ne pouvez pas accéder aux données avant que les paires ne soient disponibles. Ceci est ma compréhension du problème.

0
Michael Migsch