Flask错误:"方法不允许请求的URL"

52

每当我尝试提交数据到我的Flask表单时,就会出现以下错误:

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

我认为问题出在我执行的return redirect(url_for('database'))上。我也尝试过return render_template('database.html')。我想在表单条目被提交到数据库后调用数据库页面。

代码的相关部分如下:

@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是一个页面,其中包含有关特定博客文章的详细信息以及与该文章相关联的评论和反馈。

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>

和 database.html 相关的内容...

THIS IS THE QUERY:

{{query}}
9个回答

65

这里发生的情况是数据库路由不接受任何URL方法。

我建议将url方法放在应用程序路由中,就像您在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)

谢谢,那解决了问题。不过由于某些原因,它现在无法提交到数据库了。 - Suraj Kapoor
1
这是因为您的数据库提交功能位于entry_page函数中,而您的表单提交却重定向到了数据库函数。您可能希望将该逻辑从entry_page函数中移出,并放入数据库函数中。 - Wondercricket
1
我很高兴能够帮助。如果您希望在重定向之前执行数据库提交,则 entry_page 函数看起来是正确的。您只需要删除表单标签中的 action 属性即可。如果您删除该标签,它将使用 post 方法刷新页面,然后应该进入您的 if 语句。 - Wondercricket
1
将URL方法放入其中对我有用:.. methods=['GET', 'POST']) ---谢谢! - Leo Gurdian
可能只是我,但它看起来完全就像所问的问题...? - Dekriel
显示剩余2条评论

8
我认为您忘记添加数据库函数的方法。
@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)

6

当我在IIS中部署我的Flask应用程序时,遇到了类似的问题。显然,IIS不接受包含下划线(“_”)的路由。当我删除下划线后,问题得到解决。


1

我遇到了同样的问题,我的解决方法是将 ":" 替换为:

return redirect(url_for('index'))

使用

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

在我的POST和DELETE路由中。

1

Flask需要在表单标签中添加enctype=""。如下所示:

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

0
尝试添加方法

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


这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - Deenadhayalan Manoharan
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

0

我也遇到了类似的问题,重定向在我的开发服务器上随机返回404或405错误。这是gunicorn实例的问题。

事实证明,在启动新的测试之前,我没有正确关闭gunicorn实例。两个进程同时运行,监听同一个8080端口并相互干扰。 奇怪的是,它们在我杀死所有终端后仍然在后台运行。 必须使用fuser -k 8080/tcp手动杀死它们。


0
也许与这个错误并行: 假设您的端点如下所示:
    @app.route('/entry', methods=['GET', 'POST'])

现在,如果您的HTML中action属性与所提到的端点不匹配,那么自然会出现错误:

    <!-- N.B. its `entri`; but it should be `entry`-->
    <form action="entri" method="post" class="">

这很明显,但可能会有些隐蔽。希望能对某些人有所帮助。


0
花了我将近5个小时,对我来说解决方案就是先指定方法,然后再执行操作。
<form method = "post" action='/database'>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接