【问题标题】:Separate Flask route GET method from POST将 Flask 路由 GET 方法与 POST 分开
【发布时间】:2022-01-08 04:58:19
【问题描述】:

我有以下文件上传路线。

@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


【解决方案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()

【讨论】:

  • 我想让一个路由函数遵循单一职责原则。假设 GET 方法逻辑应该与 POST 逻辑分开处理,所以它们不能在同一个函数中。
  • 这就是路由调用的do_the_loginshow_the_login_form 函数的目的。每个人都有一个单一的责任;路由只是一个包装器。
  • 好的,我如何将 FileUploadForm 从 show_the_login_form 传递到 do_the_logic
  • 您可以在路由中实例化表单,然后将其传递给两个函数。
  • 我的主要目标是摆脱这种 if 条件,因此我不必在路线内检查 request.method。但我坚持如何将表单从 GET 传递到 POST 来处理它。
【解决方案2】:

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

@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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    相关资源
    最近更新 更多