用于 Mysql 查询的 FLASK HTML 字段

Posted

技术标签:

【中文标题】用于 Mysql 查询的 FLASK HTML 字段【英文标题】:FLASK HTML field for Mysql query 【发布时间】:2017-05-02 06:26:54 【问题描述】:

你好 *** 社区,

我是 FLASK 的新手,但是虽然学习曲线非常陡峭,但有一个项目我无法理解。

我正在使用一个非常简单的 html 搜索表单,用户在其中输入城市名称,此输入被传递给 mysql 查询并将输出返回到表中。

除了我无法将变量传递到 Mysql 之外,一切都正常...如果我修复了查询,它就可以工作了。

我尝试使用 FLASK WTForms、POST 和 GET 请求,但我不知道我哪里出错了。 我传递的变量数据不是机密的,所以我不担心它是否会出现在 URL 中。

这里只是简单的表格(我猜不正确)

  <form>
<div class="form-group">
    <div class="col-sm-3">
        <input type="text" placeholder="City Name" name="City_Name" action=/search class="form-control">
    </div>

<div class="form-group">
    <div class="col-sm-2">
        <input type="submit" value="SEARCH" class="btn btn-primary btn-block">
    </div>
    </div>
</form>

这里是表格输出(完美运行)

<table class="table table-striped">


            <tr>
              <th>PO_Number</th>
              <th>Plant Name</th>
              <th>GMID</th>
              <th>Material</th>
              <th>INCOTERM</th>
              <th>Vendor</th>
              <th>Vendor Count</th>
            </tr>


           % for row in tabledata %
           <tr>

             <td> row['PO_Number'] </td>
             <td> row['PN'] </td>
             <td> row['GD'] </td>
             <td> row['MN'] </td>
             <td> row['INCO'] </td>
             <td> row['VNGS'] </td>
             <td> row['CVNGS'] </td>
           </tr>
           % endfor %

   </table>

这里是 Python 代码

from flask import Flask, render_template, request, url_for
from dbhelper_single_search import DBHelper


app = Flask(__name__)
DB = DBHelper()


@app.route('/table')
def table():
    try:
        tabledata = DB.table_inputs()
    except Exception as e:
        print(e)
        tabledata = None
    return render_template("table.html", tabledata=tabledata)


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

Data Base Helper Mysql(PLN 的值应根据表单中的输入而变化。

import pymysql
class DBHelper:

def table_inputs(self):
        connection = self.connect()
        PLN="**City_Name**"
        try:
            query = "SELECT Plant_Geo, Plant_Code, Plant_Name, GMID, Material_Name, GROUP_CONCAT(DISTINCT Vendor_Name_GS ORDER BY Vendor_Name_GS) as VNGS, sum(2014_USD), sum(2015_USD), sum(2016_USD) FROM invoice_report WHERE plant_code like '%s' GROUP BY GMID ORDER BY sum(2015_USD) DESC" %(PLN);
            with connection.cursor(pymysql.cursors.DictCursor) as cursor:
                cursor.execute(query)
            return cursor.fetchall()
        finally:
            connection.close()

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

我认为您需要在 &lt;form&gt; 元素上设置操作,而不是 &lt;input&gt;,并且您希望将其定向到同一个 Flask 端点(我假设?):

<form method="GET" action>
    <div class="form-group">
        <div class="col-sm-3">
            <input type="text" placeholder="City Name" name="City_Name" class="form-control">
        </div>
    </div>
    <div class="form-group">
        <div class="col-sm-2">
            <input type="submit" value="SEARCH" class="btn btn-primary btn-block">
        </div>
    </div>
</form>

稍微更新你的助手类,从你的视图函数中接受一个城市变量(你可以把它收紧一点):

import pymysql


class DBHelper:

    def table_inputs(self, city):
        connection = self.connect()
        PLN = "**%s**" % city
        try:
            query = "SELECT Plant_Geo, Plant_Code, Plant_Name, GMID, Material_Name, GROUP_CONCAT(DISTINCT Vendor_Name_GS ORDER BY Vendor_Name_GS) as VNGS, sum(2014_USD), sum(2015_USD), sum(2016_USD) FROM invoice_report WHERE plant_code like '%s' GROUP BY GMID ORDER BY sum(2015_USD) DESC";
            with connection.cursor(pymysql.cursors.DictCursor) as cursor:
                # actually better to pass parameters like this:
                cursor.execute(query, (PLN,))
            return cursor.fetchall()

        except Exception as err:
            # this may also help find errors generated above...
            print(err)

        finally:
            connection.close()

然后,更新您的视图函数以测试是否提交了城市并将其提交到您的帮助程序类:

@app.route('/table')
def table():
    // the second argument is the default if "City_Name" is not submitted
    city = request.args.get('City_Name', 'New York')
    try:
        tabledata = DB.table_inputs(city)
    except Exception as e:
        print(e)
        tabledata = None
    return render_template("table.html", tabledata=tabledata)

【讨论】:

PJ Santoro,非常感谢!这 100% 有效。非常好的帮助,非常感谢。 太好了,很高兴我能帮上忙!如果您能接受答案,那就太好了。 PJ Santoro 已经有一段时间了,我去年使用了这个代码。但是最近我升级到 macOS Sierra 和 MariaDB 10.2.9,代码(完全相同)现在抛出“TypeError:'NoneType' object is not iterable”。我不知道为什么,但如果您有任何想法,我将不胜感激。 也许可以尝试将%s 更改为?... 可能是DBAPI 中的小改动... 不熟悉MariaDB PS:刚刚在上面做了一些编辑... 1)更好的做法是直接将参数传递到执行函数中,以便正确转义所有内容 2)添加了一个 except 子句,因为我假设有一个错误tabledata 最终以 None... 因此您遇到的错误

以上是关于用于 Mysql 查询的 FLASK HTML 字段的主要内容,如果未能解决你的问题,请参考以下文章

flask怎样查询mysql并显示在页面上

flask怎样查询mysql并显示在页面上

如何用flask实现一个web应用来显示在mysql数据库中查询到的内容

使用 Python/Flask 进行 MySQL 查询

Flask 查询 Mongodb 很慢

如何用flask实现一个web应用来显示在mysql数据库中查询到的内容