Flask:在表单提交后重定向到同一页面

时间:2016-12-21 19:51:10

标签: python flask

我的模板中有两个表单:一个用于发布内容,另一个用于在服务器上激活文件删除:

<div style="margin-bottom:150px;">
    <h4>Delete</h4>
    <form method="post" action="/delete">
        <div class="form-group">
            <input type="hidden" name="delete_input"></input>
        </div>
        <button type="submit" class="btn btn-danger" id="btnSignUp">Delete</button>
    </form>
</div>

<div style="margin-bottom:150px;">
    <h4>URLs</h4>
    <form method="post" action="/">
        <div class="form-group">
            <textarea class="form-control" rows="5" id="urls" name="url_area"></textarea>
        </div>
        <button type="submit" class="btn btn-primary" id="btnSignUp">Urls</button>
    </form>
</div>

我的app.py看起来像这样:

@app.route("/")
def main():
    return render_template('index.html')


@app.route('/', methods=['POST'])
def parse_urls():
    _urls = request.form['url_area'].split("\n")
    image_list = get_images(_urls)
    return render_template('index.html', images=image_list)


@app.route('/delete', methods=['POST'])
def delete_images():
    file_list = [f for f in os.listdir("./static") if f.endswith(".png")]
    for f in file_list:
        os.remove("./static/" + f)
    image_list = []
    conn = sqlite3.connect('_db/database.db')

    curs = conn.cursor()
    sql = "DROP TABLE IF EXISTS images"
    curs.execute(sql)
    conn.commit()
    conn.close()
    return render_template('index.html', images=image_list)

两个问题:

  • 我在提交表单后重新加载页面时收到表单重新提交消息
  • 我想为一切提供一个网址

我看到它的方式,我需要使用重定向来避免重复提交,并在调用删除后,我需要重定向到索引。

我该如何正确地做到这一点?

我知道redirecturl_for,但如何重定向到同一页?

5 个答案:

答案 0 :(得分:5)

您可以将所有内容放在一个网址中,但您必须检查已提交的表单。您可以拥有不同的观看次数但不呈现内容,在提交删除表单时将所有表单放入主页只需将delete查看功能添加到此表单操作action="{{url_for('delete_images')}}"

@app.route('/delete', methods=['POST'])
def delete_images():
    if request.method == 'POST':
        # do your work here
        return redirect(url_for('delete_images')

答案 1 :(得分:3)

您可以通过TRUE获取当前请求的URL:

因此,要重定向到同一页面,请使用:

request.url

答案 2 :(得分:2)

如弓箭手所述:

return redirect(request.referrer)

当您有一个单击时使用路由执行给定功能的按钮时,这很有用-您不想将用户返回到该按钮的URL-您想将用户返回到URL按钮路由所引用的位置,即用户单击按钮时所在的页面。

但是,正如Mahmoud所说:

redirect(request.url)

如果您在不使用路由或特殊URL或类似内容的页面上执行某项功能,则此方法非常理想。本质上,它只是刷新页面。

答案 3 :(得分:0)

一种方法是在表单中通过Javascript设置当前网址。像:

logN

用JS设置隐藏的输入值,比如

<form method="post" action="/delete">
    <div class="form-group">
        <input type="hidden" name="delete_input"></input>
    </div>
    <input type=hidden class=current_url value="" name=current_url>
    <button type="submit" class="btn btn-danger" id="btnSignUp">Delete</button>
</form>

在服务器上,function get_current_url() { var url=window.location.href; return url } $(window).on('load',function(){ var current_url=document.getElementsByClassName('current_url')[0]; current_url.value=get_current_url(); }) 到发布数据的网址

答案 4 :(得分:-1)

这对我来说很完美,在最后一行:

return redirect(request.referrer)