Python3で、flaskを使って値をhtmlテンプレートに返そうとしています。
ですが、pandasを使って取得した値は普通に返せるのに、Mysqlを使って取得した値は返すことができなくて、その原因にずっと悩んでいます。お力添え頂けたら幸いです。
#使用環境
- CentOS7.4
- Nginx
- Python3.7
- MariaDB
##動作している
xlstest.py
python
1from flask import Flask, render_template 2import pandas as pd 3app = Flask(__name__) 4 5#Excelファイルの取り込み 6filename = "xls/xls_data.xlsx" 7df = pd.read_excel(filename, encoding='utf8', index_col=0) 8#ヘッダの格納 9xlsheaders = [] 10for header in df: 11 xlsheaders.append(header) 12df.fillna("", inplace=True) 13xlsheaders.insert(0,"") 14#データの格納 15xlsrows = [] 16#データフレームをデータ配列に格納 17for row in df.itertuples(): 18 xlsrows.append(row) 19#値の受け渡し準備 20 21#ルーティング 22@app.route('/') 23def xlslist(): 24 print(xlsrows) #値を取得できる 25 return render_template("xlslist.html", title = "flaskのテスト", xlsarray={ "xlsheaders":xlsheaders, "xlsrows":xlsrows} ) #変更 26 27if __name__ == "__main__": 28 app.run(debug=False, host= '0.0.0.0', port=5000)
##動作エラーが起きる
dbquery.py
Python
1#Mysqlに接続 2from flask import Flask, render_template 3import pymysql.cursors 4app = Flask(__name__) 5 6class Db: 7 rows = '' 8 def con(self): 9 conn = pymysql.connect( 10 user='root', 11 passwd='password', 12 host='192.168.xx.xx', 13 db='database' 14 ) 15 c = conn.cursor() 16 self.c = c 17 18 def query(self,sql): 19 c = self.c 20 c.execute(sql) #sql実行 21 rows = c.fetchall() 22 self.rows = rows 23 return self.rows 24 25#dbの実行 26rows = [] 27db = Db() #インスタンス作成 28db.con() #db接続 29sql = 'select * from master' 30rows = db.query(sql) #クエリ取得 31print(rows) #値は取得できている(アクセスエラーにはなっていない) 32#レンダリング 33@app.route('/') 34def dbtest(): 35 print(rows) #何も取得しない 36 return render_template('dbtest.html',rows=rows) 37 38 39if __name__ == "__main__": 40 app.run(debug=False, host= '0.0.0.0', port=5000)
テンプレート
html
1{% extends "layout.html" %} 2{% block content %} 3 <table border= "1" cellspacing="0"> 4 <tr> 5 <th>都市名</th> 6 <th>MLB</th> 7 <th>NBA</th> 8 <th>NFL</th> 9 <th>NHL</th> 10 <th>MLS</th> 11 </tr> 12 <tbody> 13 {% for row in rows %} 14 <tr> 15 <td>{{ row.city_nm }}</td> 16 <td>{{ row[1] }}</td> 17 <td>{{ row[2] }}</td> 18 <td>{{ row[3] }}</td> 19 <td>{{ row[4] }}</td> 20 <td>{{ row[5] }}</td> 21 </tr> 22 {% endfor %} 23 </tbody> 24 </table> 25{% endblock %}
#試したこと
- dbtest( rows)として引数を入れてみた → エラー
- オブジェクトから直接値を取得するようself.rowsとしてみた → 何も取得しない
- dbの実行の部分をdetest()以下に入れてみた。何も取得しない
#疑問点
flaskで用いる任意の引数で、外部から取得したpostやgetについては記述があるのですが、プログラム内で取得した値を渡す方法については探索中です。…が、なかなか答えに届きません。また、なぜpandasで取得した値は値を取得できて、fetchした値は取得できないのか、その理由も知りたいです。
よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/26 09:14 編集
2020/01/09 11:49