Flask: используйте функцию [GET, POST] для одного URL - PullRequest
1 голос
/ 01 мая 2019

Я новичок в 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

Ответы [ 3 ]

1 голос
/ 01 мая 2019

Вы можете проверить количество аргументов и вернуть форму HTML, если длина равна 0, например:

    # 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)

Это будет:

  • показать form.html если вы загрузите /sample без аргументов
  • показывает аргументы в формате JSON, если вы загружаете /sample с допустимыми аргументами (например, /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)
  • показать "Неверные аргументы" в любом другом случае
1 голос
/ 01 мая 2019

Ооо ... Я вижу ... так как я могу отобразить .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.

Кроме того, вместо того, чтобы всегда проверять метод запроса, я предлагаю вам взглянуть на MethodView Flask. Используя это, вы можете легко разделить вашу логику на запрос с аргументами в строке запроса и отправкой формы с помощью json: http://flask.pocoo.org/docs/1.0/api/#flask.views.MethodView

0 голосов
/ 01 мая 2019

Попробуйте этот код, надеюсь, он вам поможет.По умолчанию он использует метод 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)
...