Flask Error: “Methode niet toegestaan De methode is niet toegestaan voor de gevraagde URL”

Ik krijg de volgende foutmelding wanneer ik gegevens probeer in te dienen op mijn Flask-formulier:

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

Ik denk dat het probleem zit in de return redirect(url_for('database'))die ik aan het doen ben. Ik heb ook return render_template('database.html)geprobeerd. Ik probeer de databasepagina te bellen zodra formulierinvoer is ingediend bij de database.

Relevante delen van mijn code zijn als volgt:

@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>

en database.html…

THIS IS THE QUERY:
{{query}}

Antwoord 1, autoriteit 100%

Wat hier gebeurt, is dat de databaseroute geen URL-methoden accepteert.

Ik zou proberen de url-methoden in de app-route te plaatsen, net zoals je hebt gedaan in de functie entry_page:

@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)

Antwoord 2, autoriteit 10%

Ik had een soortgelijk probleem toen ik mijn Flask-app in de IIS implementeerde. Blijkbaar accepteert IIS geen routes die een onderstreping (“_”) bevatten. Toen ik de onderstreping verwijderde, was het probleem opgelost.


Antwoord 3, autoriteit 8%

Ik denk dat je bent vergeten methoden toe te voegen voor je databasefunctie.

@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)

Antwoord 4, autoriteit 2%

Ik had hetzelfde probleem en mijn oplossen was om te vervangen:

return redirect(url_for('index'))

met

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

in mijn POSTen DELETEroute.


Antwoord 5

Ik had ook een soortgelijk probleem waarbij omleidingen 404 of 405 willekeurig gaf op mijn ontwikkelingsserver. Het was een probleem met Gunicorn-instanties.

blijkt dat ik de Gunicorn-instantie niet goed had gesloten voordat ik een nieuwe testen startte.
Op de een of andere manier liepen beide processen tegelijkertijd, luisteren naar dezelfde poort 8080 en interfereerden met elkaar.
Vreemd genoeg blijven ze op de achtergrond lopen nadat ik al mijn terminals had gedood.
Moest ze handmatig doden met fuser -k 8080/tcp

Other episodes