字符串POST请求到烧瓶

时间:2020-01-23 02:15:51

标签: python flask

我正在尝试使用Flask实现一个简单的仪表板,该仪表板将:

  1. 接受带有“提交”按钮的用户文本输入。将此用户输入信息发布到flask。
  2. Flask接受此输入,对其进行一些处理,然后向另一个API发出GET请求。
  3. 此GET请求返回数据并以某种方式显示它(现在可以是console.log

以星际大战API为例:

  1. 用户输入“星球大战”角色的名称(假设没有拼写错误)
  2. Flask会读取此输入名称,并将其映射到ID号,因为Star Wars API接受ID号。向“星球大战” API发出GET请求,以获取完整的角色信息。
  3. 目前,我们只能console.log个字符信息(例如“身高”,“质量”等)

我现在所拥有的:

app.py

from flask import Flask, jsonify, request, render_template
import random
import json

app = Flask(__name__)


@app.route("/")
def index():
    return render_template('index.html')


@app.route("/form_example", methods=["GET", "POST"])
def form_example():
    if request.method == "POST":
        language = request.form("character_name")
        starwars_dictionary = {"Luke Skywalker":"1", "C-3PO":"2", "R2-D2": "3"}
        # starwars_dictionary is a dictionary with character_name:character_number key-value pairs.
        # GET URL is of the form https://swapi.co/api/people/<character_number>

    return render_template("index.html")


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

index.html

<!DOCTYPE html>
<html>
<head>
    <title>py-to-JS</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
</head>
<body>
    <h3>Sample Inputs</h3>
    <ul>
        <li>Luke Skywalker</li>
        <li>C-3PO</li>
        <li>R2-D2</li>
    </ul>

    <form method="POST">
        Enter Name: <input type="text" name="character_name"><br>
        <input type="submit" value="Submit"><br>
    </form>
</body>
</html>

在当前形式下,当我运行应用程序时,它返回“不允许使用方法;所请求的URL不允许使用此方法”。

我不确定我缺少什么;它可能只是没有正确地连接在一起,但是我不确定正确的语法是什么。


实施可接受的答案后的工作版本:

app.py

from flask import Flask, jsonify, request, render_template
import requests
import random
import json

app = Flask(__name__)


@app.route("/index", methods=["GET", "POST"])
def index():
    #character_height = "" # init a default value of empty string...seems unwieldy
    if request.method == "POST":
        character_name = request.form.get("character_name")

        # Map user input to a numbers
        starwars_dictionary = {"Luke Skywalker":"1", "C-3PO":"2", "R2-D2": "3"}
        char_id = starwars_dictionary[character_name]

        url = "https://swapi.co/api/people/"+char_id
        response = requests.get(url)
        response_dict = json.loads(response.text)
        character_height = response_dict["height"]

        return render_template("index.html", character_height=character_height)

    return render_template("index.html")

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


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

index.html

<!DOCTYPE html>
<html>
<head>
    <title>py-to-JS</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
</head>
<body>
    <h3>Sample Inputs</h3>
    <ul>
        <li>Luke Skywalker</li>
        <li>C-3PO</li>
        <li>R2-D2</li>
    </ul>

    <form method="POST" action="/index">
        Enter Name: <input type="text" name="character_name"><br>
        <input type="submit" value="Submit"><br>
    </form>

    {{ character_height }}
</body>
</html>

1 个答案:

答案 0 :(得分:0)

该表单可能正在发布到/端点,因为您没有声明表单action

需要更像:

<form method="POST" action="/form_example">

或者如果您想变得时髦并使用Jinja的url_for函数:

<form method="POST" action="{{ url_for('form_example') }}">

编辑:也就是说,您可以使用一个路由功能来处理此问题:

@app.route("/", methods=["GET", "POST"])
def index():
    if request.method == "POST":
        language = request.form("character_name")
        starwars_dictionary = {"Luke Skywalker":"1", "C-3PO":"2", "R2-D2": "3"}

        # Logic to query remote API ges here.

    else: # Assume method is GET
        return render_template("index.html")

然后执行表单操作{{ url_for('index') }}