【问题标题】:GET request with parameters FlasK/Rest API带参数的 GET 请求 FlasK/Rest API
【发布时间】:2019-04-10 08:14:56
【问题描述】:

我正在尝试执行 GET 请求,该请求应根据设置的参数从我的数据库中打印特定行。参数应该是课程的名称,我希望它从所选课程中获取所有数据。将其解释为 SQL 查询可能会更容易一些。查询可能看起来像这样“SELECT * FROM courselist WHERE course='D0024E';” 在哪里“课程”。

我已经设法执行 fetchall() 并从特定表中接收所有行,但我没有设法使参数正常工作,因此我可以从特定课程中获取信息。

from flask import Flask
from flask import render_template
import requests
from flask import request
from flask import jsonify
import mysql.connector

app = Flask(__name__)

mydb = mysql.connector.connect(user='Mille',
                          auth_plugin='mysql_native_password',
                          password='jagheter12',
                          host='localhost',
                          database='paraplyet')

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

@app.route('/courses', methods= ["GET"])
def getStudentInCourse():
    myCursor2 = mydb.cursor()
    query2 = ("SELECT * FROM paraplyet.kursinfo")
    myCursor2.execute(query2)
    myresult2 = myCursor2.fetchall()

    return jsonify(myresult2)

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

【问题讨论】:

  • 您没有设法使哪些参数正常工作?您的预期结果应该是什么?
  • 我真的没有适合你的解决方案,但是在使用 Flask 和数据库时,我一直使用 SQLAlchemy,它与 Flask 具有出色的集成,并且适用于大多数(如果不是全部)类型的 db .
  • @DirkxSenne 是的,你是对的,但我猜他可能应该有同样的问题,因为它可能与 GET 参数有关。
  • @DirkxSenne 是的,你是对的,但我猜他可能应该有同样的问题,因为它可能与 EDIT: sql 相关。
  • @Geeocode 我的第一条评论有点难以阅读。在 haseeb mazhar Ranga 下面查看我的答案,我想我在那里解释得很好。

标签: python mysql rest flask flask-restful


【解决方案1】:

你需要更新你的路由url来接收参数

@app.route('/courses/<course_code>', methods= ["GET"])
def getStudentInCourse(course_code):

然后你可以使用这个 course_code 来过滤结果。

【讨论】:

  • 我以前试过这个,我认为我的查询是错误的。我想要在 SQL query2 中使用的 URL 中设置的 。有没有办法做到这一点? @app.route('/courses/', methods= ["GET"]) def getStudentInCourse(course_code): query2 = ("SELECT * FROM paraplyet.kursinfo WHERE courseCode = 'course_code' ") //我的查询你明白我想要它吗?我想要用户在 URL 中输入的内容,然后在我的 SQL 查询中使用该字符串。然而,这不起作用。 @Haseeb Mazhar Ranga
【解决方案2】:

实际上,您的代码有几个可能会失败,因为在 Flask 中建立正确的前端后端链有点棘手(但最终值得)。 您有一个对应部分 front-end HTML 代码,您可以在其中使用适当的变量开始您的请求,例如示例中的“course”,可能如下所示:

<form action="/courses" method="post">
  <input>
  <button type="submit"></button>
</form>

然后作为 后端 的 Flask 会将此变量(参数)作为您的查询字符串的一部分作为 URL 字符串 的一部分。您可以通过以下形式检索此参数:

course = request.form.get('course')

要实现它,您必须添加 "POST" 视图的方法,因为它默认只处理 "GET"-s。

@app.route('/courses', methods=["GET", "POST"])

然后你可以使用这个变量来完成你的后端操作:

query2 = ("SELECT * FROM courseInfo where courseCode = '" + course +  "';")

这些结果然后您可以通过以下方式将其传递回前端:

return jsonify(myresult2)

您的 python/flask 代码应如下所示:

from flask import Flask
from flask import render_template
import requests
from flask import request
from flask import jsonify
import mysql.connector

app = Flask(__name__)

mydb = mysql.connector.connect(user='Mille',
                          auth_plugin='mysql_native_password',
                          password='jagheter12',
                          host='localhost',
                          database='paraplyet')

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

@app.route('/courses', methods= ["GET", "POST"])
def getStudentInCourse():

    if request.method == "POST" and request.form.get('course') != '':

        myCursor2 = mydb.cursor()

        course = request.form.get('course')
        query2 = ("SELECT * FROM courseInfo where courseCode = '" + course +  "';")

        myresult2 = myCursor2.execute(query2)

        return jsonify(myresult2)

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

【讨论】:

  • 点赞您的帖子。我已通读并了解其中大部分内容。我现在收到一个错误,我认为这是因为“TypeError:无法连接'str'和'NoneType'对象”。有什么猜测吗?我与数据库的连接有效。也许它与“课程”字符串有关?
  • 我尝试使用 str(course) 方法修复它,但没有解决问题。当我第一次在表单中输入任何值时,我得到一个空值作为回报。如果我在第一次收到“InternalError: Unread result found”后尝试发布相同或另一个值。如果我重新启动服务器也会发生同样的事情,第一次发布我返回“null”的内容,然后是内部错误......@Geecode
  • @Milletarp 这就是为什么,因为您的 HTML 没有传递“course”参数,所以还没有传递“Nonetype”。在视图函数的第一行插入print(type(request.form.get('course'))),您将在 bash 终端中打印“Nonetype”。为了能够提供更多帮助,您必须以某种方式向我提供 HTML 代码相关部分。
  • 一只小鸟悄悄告诉我我还有一个问题 ;-) *.com/questions/53263766/…
  • @Milletarp 我在这里的回答是正确的,但你不接受它。您链接的问题包含一些问题,主要与我在这里提到的问题相同,这就是您的问题仍然存在的原因