试图从烧瓶中将 table 插入到 jinja2 模板中
Trying to insert a table into jinja2 template from flask
我一直在尝试创建我的第一个 Flask 网站,使用 Jinja2
中的超简单模板。 (我从我的常规 html 开始并很快放弃了它,因为弄清楚把东西放在哪里是一场噩梦。我会在这个困难的部分之后返回并调整烧瓶代码,现在,我除了 html 声明和尝试放入 table 之外,已经消除了所有内容。)
烧瓶代码:
from flask import Flask
from flask import render_template
import redis
from flask import json
from dateutils.parser import parse
from flask_table import Table, Col, DatetimeCol
r=redis.StrictRedis(host='localhost', port =6379, db=0)
app = Flask(__name__)
@app.route('/')
@app.route('/p/')
def p():
raw = r.get('rData')
raw= yaml.load(raw)
raw = json.loads(raw)
for item in raw:
item['date_time'] = parse(item['date_time'])
class ItemTable(Table):
Sensor = Col("Sensor")
date_time = DatetimeCol("Date & Time")
Reading = Col("Reading")
table = ItemTable(raw)
return render_template('p.html'), table
if __name__ == '__main__':
app.run()
此代码将在本地调用页面 /p/,如果我要求它显示 raw
,它将打印出此 table 的数据(我在下面包括了)。
{{ raw }}
我把字典拿回来了!
但是当我试图向 table 展示
ItemTable
应该会创建,但它会使我的页面崩溃或根本不显示任何内容。我也尝试过这样使用 return 代码:
return render_template('p.html', table=table)
将其作为完全执行的变量传递 html,没有任何好处。
{{ table }}
词典列表中的实际数据:
[{"date_time": "2016-08-03T14:00:00.000-04:00", "Reading": 27.5, "Sensor": "Water Temperature (degrees Celsius)"}, {"date_time": "2016-08-03T14:00:00.000-04:00", "Reading": 0.91, "Sensor": "Lake Gage Height (in feet)"}, {"date_time": "2016-08-03T14:00:00.000-04:00", "Reading": 53.0, "Sensor": "Specific Conductivity in microSiemens"}, {"date_time": "2016-08-03T14:00:00.000-04:00", "Reading": 7.3, "Sensor": "Dissolved Oxygen (ppm)"}, {"date_time": "2016-08-03T14:00:00.000-04:00", "Reading": 6.9, "Sensor": "pH (standard field)"}, {"date_time": "2016-08-03T14:00:00.000-04:00", "Reading": 27.7, "Sensor": "Air Temperature (in degrees Celsius)"}, {"date_time": "2016-08-03T14:00:00.000-04:00", "Reading": 2.5, "Sensor": "Wind Speed (in mph)"}, {"date_time": "2016-08-03T14:00:00.000-04:00", "Reading": 238.0, "Sensor": "Wind Direction (degrees CW from North)"}, {"Reading": 30.7, "Sensor": "Relative Humidity", "date-Time": "2016-08-03T14:00:00.000-04:00"}, {"date_time": "2016-08-03T14:00:00.000-04:00", "Reading": 1.26, "Sensor": "Marsh Gage Height in feet"}, {"date_time": "2016-08-03T14:00:00.000-04:00", "Reading": 0.01, "Sensor": "24 Cumulative Precipication (inches)"}]
我从我创建的 redis 缓存中提取它,但您可以将 raw=
设置为上面的列表并替换它。
难题:
我需要在 Jinja2 中插入什么才能使 table 从这两个 return
演示之一中显示出来,或者是否有其他方法告诉 flask 移植转换后的列表词典到模板?
我到处找了,flask-table上的页面没有显示怎么在另一边呈现。
我的目标是将它放在一个容器中,该容器是基本布局的子容器。但只要让它显示为 table 就足够了,我可以从那里算出其余部分。
我可以创建的最简单的 HTML/Jinja 模板:
<!doctype html>
<h1> test </h1>
{{table}}
我尝试使用 {% table %}
也无济于事。
我不确定问题是我在 flask 中生成了 html 并试图将它发送到模板,还是我没有告诉 Jinja 如何呈现这个 table
元素已创建并包含在 render_template
方法中。
<h1> test </h1>
只是让我在发送 table 时查看页面是否正在呈现。这不重要。
我认为我遇到的问题是大多数教程都过于简化,每组文档(Flask
和 Jinja2
)都清楚地说明了等式另一边发生的事情.我发现 ONE 对 flask-table
的解释出现在两页上,但内容相同。两者都没有提出使用模板调用它的建议。
更新:
我现在 运行 时出现 KeyError:更改如下:
raw= yaml.load(raw) #new to make a list for reading after next line
raw = json.loads(raw) #makes it iterable in UTF-8
for item in raw:
item['date_time'] = parse(item['date_time']) #creates dates but throws
errors which stops flask
新编辑:json.loads之后的部分数据:
[{u'Reading': 25.9,
u'Sensor': u'Water Temperature (degrees Celsius)',
u'date_time': u'2016-08-05T08:45:00.000-04:00'},
{u'Reading': 0.88,
u'Sensor': u'Lake Gage Height (in feet)',
u'date_time': u'2016-08-05T08:45:00.000-04:00'}]
解析后的数据['date_time']:
raw[1]['date_time']
datetime.datetime(2016, 8, 5, 8, 45, tzinfo=tzoffset(None, -14400))
新更新: 我不知何故在 date_time
字段中漏掉了一个大写字母 T,因此更正它修复了 KeyError。 ..但我仍然无法将其传递到 HTML。我得到一大堆引用文件夹和文件的行,然后我得到:
AttributeError: 'NoneType' object has no attribute 'datetime_formats'
为什么日期和时间这么有趣?
您需要将时间戳转换为日期时间对象
from dateutil.parser import parse # pip install python-dateutil
raw = json.loads(raw)
for item in raw:
item['date_time'] = parse(item['date_time'])
并将table
传递给模板
return render_template('p.html', table=table)
更新:所有项目都必须有一个 date_time
键。您示例中的某些项目改为 date-Time
。
我一直在尝试创建我的第一个 Flask 网站,使用 Jinja2
中的超简单模板。 (我从我的常规 html 开始并很快放弃了它,因为弄清楚把东西放在哪里是一场噩梦。我会在这个困难的部分之后返回并调整烧瓶代码,现在,我除了 html 声明和尝试放入 table 之外,已经消除了所有内容。)
烧瓶代码:
from flask import Flask
from flask import render_template
import redis
from flask import json
from dateutils.parser import parse
from flask_table import Table, Col, DatetimeCol
r=redis.StrictRedis(host='localhost', port =6379, db=0)
app = Flask(__name__)
@app.route('/')
@app.route('/p/')
def p():
raw = r.get('rData')
raw= yaml.load(raw)
raw = json.loads(raw)
for item in raw:
item['date_time'] = parse(item['date_time'])
class ItemTable(Table):
Sensor = Col("Sensor")
date_time = DatetimeCol("Date & Time")
Reading = Col("Reading")
table = ItemTable(raw)
return render_template('p.html'), table
if __name__ == '__main__':
app.run()
此代码将在本地调用页面 /p/,如果我要求它显示 raw
,它将打印出此 table 的数据(我在下面包括了)。
{{ raw }}
我把字典拿回来了!
但是当我试图向 table 展示
ItemTable
应该会创建,但它会使我的页面崩溃或根本不显示任何内容。我也尝试过这样使用 return 代码:
return render_template('p.html', table=table)
将其作为完全执行的变量传递 html,没有任何好处。
{{ table }}
词典列表中的实际数据:
[{"date_time": "2016-08-03T14:00:00.000-04:00", "Reading": 27.5, "Sensor": "Water Temperature (degrees Celsius)"}, {"date_time": "2016-08-03T14:00:00.000-04:00", "Reading": 0.91, "Sensor": "Lake Gage Height (in feet)"}, {"date_time": "2016-08-03T14:00:00.000-04:00", "Reading": 53.0, "Sensor": "Specific Conductivity in microSiemens"}, {"date_time": "2016-08-03T14:00:00.000-04:00", "Reading": 7.3, "Sensor": "Dissolved Oxygen (ppm)"}, {"date_time": "2016-08-03T14:00:00.000-04:00", "Reading": 6.9, "Sensor": "pH (standard field)"}, {"date_time": "2016-08-03T14:00:00.000-04:00", "Reading": 27.7, "Sensor": "Air Temperature (in degrees Celsius)"}, {"date_time": "2016-08-03T14:00:00.000-04:00", "Reading": 2.5, "Sensor": "Wind Speed (in mph)"}, {"date_time": "2016-08-03T14:00:00.000-04:00", "Reading": 238.0, "Sensor": "Wind Direction (degrees CW from North)"}, {"Reading": 30.7, "Sensor": "Relative Humidity", "date-Time": "2016-08-03T14:00:00.000-04:00"}, {"date_time": "2016-08-03T14:00:00.000-04:00", "Reading": 1.26, "Sensor": "Marsh Gage Height in feet"}, {"date_time": "2016-08-03T14:00:00.000-04:00", "Reading": 0.01, "Sensor": "24 Cumulative Precipication (inches)"}]
我从我创建的 redis 缓存中提取它,但您可以将 raw=
设置为上面的列表并替换它。
难题:
我需要在 Jinja2 中插入什么才能使 table 从这两个 return
演示之一中显示出来,或者是否有其他方法告诉 flask 移植转换后的列表词典到模板?
我到处找了,flask-table上的页面没有显示怎么在另一边呈现。
我的目标是将它放在一个容器中,该容器是基本布局的子容器。但只要让它显示为 table 就足够了,我可以从那里算出其余部分。
我可以创建的最简单的 HTML/Jinja 模板:
<!doctype html>
<h1> test </h1>
{{table}}
我尝试使用 {% table %}
也无济于事。
我不确定问题是我在 flask 中生成了 html 并试图将它发送到模板,还是我没有告诉 Jinja 如何呈现这个 table
元素已创建并包含在 render_template
方法中。
<h1> test </h1>
只是让我在发送 table 时查看页面是否正在呈现。这不重要。
我认为我遇到的问题是大多数教程都过于简化,每组文档(Flask
和 Jinja2
)都清楚地说明了等式另一边发生的事情.我发现 ONE 对 flask-table
的解释出现在两页上,但内容相同。两者都没有提出使用模板调用它的建议。
更新:
我现在 运行 时出现 KeyError:更改如下:
raw= yaml.load(raw) #new to make a list for reading after next line
raw = json.loads(raw) #makes it iterable in UTF-8
for item in raw:
item['date_time'] = parse(item['date_time']) #creates dates but throws
errors which stops flask
新编辑:json.loads之后的部分数据:
[{u'Reading': 25.9,
u'Sensor': u'Water Temperature (degrees Celsius)',
u'date_time': u'2016-08-05T08:45:00.000-04:00'},
{u'Reading': 0.88,
u'Sensor': u'Lake Gage Height (in feet)',
u'date_time': u'2016-08-05T08:45:00.000-04:00'}]
解析后的数据['date_time']:
raw[1]['date_time']
datetime.datetime(2016, 8, 5, 8, 45, tzinfo=tzoffset(None, -14400))
新更新: 我不知何故在 date_time
字段中漏掉了一个大写字母 T,因此更正它修复了 KeyError。 ..但我仍然无法将其传递到 HTML。我得到一大堆引用文件夹和文件的行,然后我得到:
AttributeError: 'NoneType' object has no attribute 'datetime_formats'
为什么日期和时间这么有趣?
您需要将时间戳转换为日期时间对象
from dateutil.parser import parse # pip install python-dateutil
raw = json.loads(raw)
for item in raw:
item['date_time'] = parse(item['date_time'])
并将table
传递给模板
return render_template('p.html', table=table)
更新:所有项目都必须有一个 date_time
键。您示例中的某些项目改为 date-Time
。