Я новичок в 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
1
Maku 1 Май 2019 в 10:09

3 ответа

Лучший ответ

Вы можете проверить количество аргументов и вернуть форму 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
glhr 1 Май 2019 в 10:03

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

1
alexxmagpie 1 Май 2019 в 10:21

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