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

2024-04-29 10:32:36 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

两个问题:

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

在我看来,我需要使用重定向来避免重复提交,在调用delete之后,我需要重定向到index。

我该怎么做才能正确?

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


Tags: imagedivformapp表单indexbuttonconn
3条回答

您可以通过request.url获取当前请求的URL:

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

redirect(request.url)

一种方法是通过Javascript在表单中设置当前url。比如:

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

并通过JS设置隐藏的输入值,比如

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();

})

在服务器上,redirect发送数据的url

您可以将所有内容放在一个url中,但必须检查哪个表单已提交。您可以有不同的视图,但不呈现某些内容,在提交delete form后将所有表单放在主页中,只需将视图函数添加到此表单操作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'))

相关问题 更多 >