【问题标题】:Flask: use [GET, POST] function for a single URLFlask:对单个 URL 使用 [GET, POST] 函数
【发布时间】:2019-05-01 07:09:19
【问题描述】:

我是 Flask 的新手,想知道是否可以使用相同的 URL 在 html 中显示表单并查询以显示某些内容

理想情况下,我希望发生以下结果。

如果我要在 138.10.2.1/sample 中创建查询:

http://138.10.2.1:8000/sample?psi=1&lavr=1&dsc=1&ifsc=1&ics=1&eng=3&ol1=1&ol2=1&reso=1&educ=1&listen=1&time=1&probe=1&unders=1

它将显示:

*something in json format*

在网页中

否则,如果我直接进入这个:

http://138.10.2.1:8000/sample

它会将我引导到一个 .html 页面,其中包含一个要填写的表单,或者允许用户附加一个文件以使用和上传以显示转换后的 json 格式文件。

这是我的代码

sample.py

from flask import Flask, flash, request, redirect, url_for, make_response, send_from_directory, render_template
import convert as ps

app = Flask(__name__)

@app.route("/sample", methods=["GET", "POST"])
def query_strings():

    #This is not working: if request.method == "POST":

        args1 = request.args["psi"]
        args2 = request.args["lavr"]
        args3 = request.args["dsc"]
        args4 = request.args["ifsc"]
        args5 = request.args["ics"]
        args6 = request.args["eng"]
        args7 = request.args["ol1"]
        args8 = request.args["ol2"]
        args9 = request.args["reso"]
        args10 = request.args["educ"]
        args11 = request.args["listen"]
        args12 = request.args["time"]
        args13 = request.args["probe"]
        args14 = request.args["unders"]

        args_list = [args1, args2, args3, args4, args5, args6, args7, args8,args9, args10, args11, args12, args13, args14]


        result = ps.execute(args_list)
        response = app.response_class(
            response=result,
            status=200,
            mimetype='application/json'
        )
        return response
    #This is my html form: return render_template("form.html")
if __name__ == '__main__':
   app.run(debug = True)

现在,我可以运行查询,但系统会提示我输入我刚刚输入时声明的参数:

http://138.10.2.1:8000/sample

【问题讨论】:

  • 不确定,但也许您想测试带或不带参数的 GET。
  • 使用 GET 进行测试是什么意思?当我使用这个时:“if request.method == "GET":" - 它允许我使用 URL 从争论中获取结果 - 如果我没有输入任何参数,它不会将我重定向到form.html
  • 我的意思是http://138.10.2.1:8000/sample?psi=1&lavr=1&dsc=... 是带参数的GET,http://138.10.2.1:8000/sample 是不带参数的。对于这两种情况,您需要不同的输出。
  • 哦..我明白了..所以如果我不输入任何参数,我如何才能显示 .html?这将允许我在 html 表单中附加一个文件并创建到 POST 并获得相同的 json 结果

标签: python python-3.x post flask get


【解决方案1】:

您可以检查参数的数量,如果长度为 0,则返回 HTML 表单,如下所示:

    # if there are no arguments provided, show HTML form
    if len(request.args) == 0:
        return render_template("form.html")

此外,无需将每个参数存储为单独的变量,然后将它们组合成一个列表。 request.args 已经是一个字典,因此您可以简单地获取参数名称和值的列表:

list(request.args.keys()) # list of argument names eg. ['psi', 'lavr', 'dsc', 'ifsc'...]
list(request.args.values()) # list of argument values eg. [1, 1, 1, 1...]

您可以检查参数名称是否与所需的集合匹配:

if set(argument_names) == {"psi","lavr","dsc","ifsc","ics","eng","ol1","ol2","reso","educ","listen","time","probe","unders"}:
        # return JSON

总体而言,您的代码可能如下所示:

from flask import Flask, request, render_template
import json

app = Flask(__name__)

@app.route("/sample", methods=["GET", "POST"])
def query_strings():
    # if there are no arguments provided, show HTML form
    if len(request.args) == 0:
        return render_template("form.html")

    argument_names = list(request.args.keys())

    # if the argument list is valid
    if set(argument_names) == {"psi","lavr","dsc","ifsc","ics","eng","ol1","ol2","reso","educ","listen","time","probe","unders"}:
        # return JSON
        response = app.response_class(
                response=json.dumps(request.args),
                status=200,
                mimetype='application/json'
        )
        return response

    return "Invalid arguments"

if __name__ == '__main__':
    app.run(debug = True)

这将:

  • 如果您加载不带参数的/sample,则显示form.html
  • 如果您使用有效参数(例如/sample?psi=1&lavr=1&dsc=1&ifsc=1&ics=1&eng=3&ol1=1&ol2=1&reso=1&educ=1&listen=1&time=1&probe=1&unders=1)加载/sample,则将参数显示为JSON
  • 在任何其他情况下显示“无效参数”

【讨论】:

  • 这太棒了!您不仅回答了我的问题,还优化了我的代码。谢谢! :) 我学到了很多!
【解决方案2】:

哦..我明白了..如果我不输入任何参数,我怎么能有一个 .html 来显示?这将允许我在 html 表单中附加一个文件并创建到 POST 并获得相同的 json 结果

根据您对问题的评论和您发布的示例代码,我认为您可能正在寻找这样的东西:

@app.route("/sample", methods=["GET", "POST"])
def query_strings():
    args1 = request.args.get("psi")
    args2 = request.args.get("lavr")
    args3 = request.args.get("dsc")
    args4 = request.args.get("ifsc")
    args5 = request.args.get("ics")
    args6 = request.args.get("eng")
    args7 = request.args.get("ol1")
    args8 = request.args.get("ol2")
    args9 = request.args.get("reso")
    args10 = request.args.get("educ")
    args11 = request.args.get("listen")
    args12 = request.args.get("time")
    args13 = request.args.get("probe")
    args14 = request.args.get("unders")

    args_list = [
        args1, args2, args3, args4, args5, args6, args7, args8,
        args9, args10, args11, args12, args13, args14
    ]

    if not all(args_list):
        return render_template('form.html')
    else:
        result = ps.execute(args_list)
        response = app.response_class(
            response=result,
            status=200,
            mimetype='application/json'
        )
        return response

在这种情况下,如果您在 GET 请求中不提供任何参数,它将呈现一个带有 html 表单的模板。

我建议你看看 Flask 的 MethodView,而不是总是检查请求方法。使用它,您可以很好地将逻辑拆分为带有查询字符串中的参数的请求,并使用 json 提交表单: http://flask.pocoo.org/docs/1.0/api/#flask.views.MethodView

【讨论】:

  • 这似乎也正确..但我想使用 POST 方法来传递 .html 可以在我接受的答案上完成..也谢谢你!
【解决方案3】:

试试这个代码,希望对你有帮助。默认情况下,它使用 GET 方法,因此它不起作用。当您单击提交按钮时,它会调用 POST 方法。

from flask import Flask, flash, request, redirect, url_for, make_response, send_from_directory, render_template
import convert as ps

app = Flask(__name__)

@app.route("/sample", methods=["GET", "POST"])
def query_strings():

    if request.method == "POST":

        args1 = request.args["psi"]
        args2 = request.args["lavr"]
        args3 = request.args["dsc"]
        args4 = request.args["ifsc"]
        args5 = request.args["ics"]
        args6 = request.args["eng"]
        args7 = request.args["ol1"]
        args8 = request.args["ol2"]
        args9 = request.args["reso"]
        args10 = request.args["educ"]
        args11 = request.args["listen"]
        args12 = request.args["time"]
        args13 = request.args["probe"]
        args14 = request.args["unders"]

        args_list = [args1, args2, args3, args4, args5, args6, args7, args8,args9, args10, args11, args12, args13, args14]


        result = ps.execute(args_list)
        response = app.response_class(
            response=result,
            status=200,
            mimetype='application/json'
        )
        # return response
        return render_template("form.html", response = response)
    return render_template("form.html")

    #This is my html form: return render_template("form.html")
if __name__ == '__main__':
   app.run(debug = True)

【讨论】:

  • 它确实显示了我的 .html 文件,但是,如果我尝试使用 URL 进行查询,它仍然会显示 .html 表单而不是返回 .json 文件
猜你喜欢
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-01
  • 2016-05-27
  • 2019-12-18
相关资源
最近更新 更多