将 Flask 路由 GET 方法与 POST 分开

问题描述 投票:0回答:3

我有以下文件上传路线。

@app.route("/upload", methods=["GET", "POST"])
def upload_file():
    form = FileUploadForm()
    if form.validate_on_submit():
        file = form.document.data
        file_name = secure_filename(file.filename)
        save_path = get_user_uploads_folder(current_user) / file_name
            return redirect(url_for("upload_file"))
        file.save(save_path)
        return redirect(url_for("list_user_files"))
    return render_template("upload_file.html", form=form)

如何分离这条路线,这样我就可以在不同的功能中使用 GETPOST 方法,并使用公共路线,如下所示:

@app.route("/upload", methods=["GET"])
def upload_file():
    return render_template(...)

@app.route("/upload", methods=["POST"])
def upload_file():
    form = FileUploadForm()
    ...
    return redirect(...)
python flask wtforms
3个回答
1
投票

这在 Flask docs 中进行了讨论。您可以使用以下模式:

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return do_the_login()
    else:
        return show_the_login_form()

0
投票

您可以检查请求中的方法,然后对其应用适当的操作。

@app.route('/upload', methods = ['GET', 'POST')
def upload_file():
    if request.method == 'GET':
        return render_template(...)
    elif request.method == 'POST':
        return redirect(...)
    else:
         // do whatever you want here for exceptions

0
投票

更改示例中其中一个方法的名称(同一范围内的Python方法名称必须是唯一的):

@app.route("/upload", methods=["GET"])
def upload_file():
    return render_template(...)

@app.route("/upload", methods=["POST"])
def upload_file_post():
    form = FileUploadForm()
    ...
    return redirect(...)

如果您按照上面的示例更改帖子并使用模板,您还需要更新表单 html 文件

    <form method="post" action="{{ url_for('upload_file_post') }}">

最后,为了更干净的路线,您可以使用帖子并获取装饰瓶提供的

@app.get("/upload")
def upload_file():
    return render_template(...)

@app.post("/upload")
def upload_file_post():
    form = FileUploadForm()
    ...
    return redirect(...)

请参阅 flask 文档了解更多信息

© www.soinside.com 2019 - 2024. All rights reserved.