烧瓶:提交表单后重定向到同一页面

use*_*892 3 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>
Run Code Online (Sandbox Code Playgroud)

我的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)
Run Code Online (Sandbox Code Playgroud)

两个问题:

  • 提交表单后重新加载页面时,我收到表单重新提交消息
  • 我希望所有内容都有一个网址

我的看法是,我需要使用重定向来避免重复提交,并且在调用delete之后,我需要重定向到索引。

如何正确执行此操作?

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

Mah*_*oud 11

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

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

redirect(request.url)
Run Code Online (Sandbox Code Playgroud)


Ioa*_*mas 10

这对我来说非常有效,在最后一行:

return redirect(request.referrer)
Run Code Online (Sandbox Code Playgroud)


met*_*irr 7

您可以将所有内容放在一个网址中,但必须检查已提交的表单。您可以具有不同的视图,但不呈现任何内容,在提交删除表单后将所有表单放在主页中,只需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'))
Run Code Online (Sandbox Code Playgroud)


小智 7

正如弓箭手在下面所说:

return redirect(request.referrer)
Run Code Online (Sandbox Code Playgroud)

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

然而,正如马哈茂德所说:

redirect(request.url)
Run Code Online (Sandbox Code Playgroud)

如果您在不使用路由或特殊 URL 或类似内容的页面上执行功能,这将是完美的。它本质上只是刷新页面。