从 Flask 重定向获取请求数据

时间:2021-03-23 15:52:30

标签: python http flask

我必须在 Flask 中创建一个包含 API 和接口的小型网络应用程序,但我面临以下问题:
这就是我处理 GET 请求的方式:

@app.route('/member/<id>', methods=['GET'])
def member_get(id):
    member = cursor.execute(f"select * from members where id={id}").fetchone()
    if member is not None:
        return to_json(member), 200
    else:
        return 'Not found', 404

我想创建一些小表单,我可以用它们来执行 GET、POST、PUT、DELETE 操作。

这就是我从表单中获取数据的方式:

@app.route('/dashboard', methods=['POST'])
def dashboard_post():
    id = request.form['get_id']
    return redirect(url_for("member_get",id=id))

我的问题是如何在不实际重定向到该页面的情况下从 API 方法获取数据? 更准确地说,我可以以某种方式调用 redirect(url_for("member_get",id=id)) 并直接获取响应数据吗? (如果我打印重定向方法的返回,它只显示请求状态)

我认为一种解决方案是使用 requests 模块,但有没有办法直接在 Flask 中做到这一点?

2 个答案:

答案 0 :(得分:1)

首先,API 应始终以一致可预测的格式返回响应。 member_get 的代码在成功时返回 JSON,在失败时返回纯文本。这不行。您应该始终返回 JSON,并带有适当的 HTTP 状态代码。这里你是用404来表达的 没找到,这个好。 为此,您可以使用 Flask 中的 jsonify 函数。并且可能对响应进行规范化,以便它始终具有相同的形状,无论是否找到成员 ID。

否则,解析来自您的 API 的响应将更加困难,因为它会根据场景不一致。

第二点,如果我理解正确:如果你想从你的 API 中调用路由“/member/”,你可以简单地做:

return member_get(id)

您调用的是附加到路由的函数,而不是路由本身。当然,您实际上可以使用 requests 模块获取页面,但这是不必要的,因为该功能在内部可用。

答案 1 :(得分:0)

您的问题不清楚,但据我了解,(1) 您认为您必须从一个视图获取表单数据并将其发送到另一个视图才能进行操作。 (2) 你对flask request和flask-wtf不熟悉。并且可能 (3) 寻找一种无需刷新或重定向页面即可执行此操作的方法。

  1. 您不需要将 GET 和 POST 方法分开。相反,您可以将两者集成到一个视图中。

    @app.route('/member/<id>', methods=['GET', 'POST])
    
  2. 为了处理数据,你可以使用flask request。

    from flask import request
    

并像这样访问您视图中的数据:

id = request.form.get("idField")

但是您也可以使用 Flask-WTF 来简单地制作和处理表单。 使用 Flask-WTF,您的视图将是这样的:

from app.forms import SearchForm

@app.route('/your-endpoint', methods=['GET', 'POST'])
def yourView():
    form = your_form()
    if form.validate_on_submit():
        id=form.idField.data
    return render_template('test.html', form=form)

条件 form.validate_on_submit() 检查您是提交来自还是刚刚打开它。如果您提交表单并且其数据基于表单中定义的验证器有效,则代码将运行。否则只呈现模板并返回页面。

要了解如何使用 Flask-WTF 制作表单,我建议阅读this 文章:

  1. 如果您不想在提交表单后刷新页面或重定向页面,您可以在页面上使用 AJAx。
相关问题