【问题标题】:Trying to insert a table into jinja2 template from flask试图从烧瓶中将表格插入 jinja2 模板
【发布时间】:2016-08-04 23:10:24
【问题描述】:

我一直在尝试创建我的第一个 Flask 网站,使用 Jinja2 中的超级简单模板。 (我从我的常规 html 开始并很快放弃了它,因为弄清楚将东西放在哪里是一场噩梦。在完成这个困难的部分后我将返回并调整烧瓶代码,现在,我已经消除了除了 html 之外的所有东西声明并尝试放入表中。)

烧瓶代码:

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 它将打印出该表的数据(我已在下面包含)。

{{ raw }}

我把我的字典拿回来了!

但是当我尝试向表格展示 ItemTable 应该创建,它使我的页面崩溃或根本没有显示。我也尝试过这样使用返回码:

        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 中插入什么才能使表格从这两个 return 演示文稿之一中显示出来,或者是否有其他方法可以告诉烧瓶将转换后的字典列表移植到模板?

我到处搜索,flask-table 上的页面没有显示如何在另一边展示它。

我的目标是将它放在一个容器中,该容器是基本布局的子容器。但只要让它显示为一张桌子就足够了,我可以从那里解决剩下的问题。

我可以创建的最简单的 HTML/Jinja 模板:

<!doctype html>

<h1> test </h1>


{{table}}

我尝试使用{% table %} 也无济于事。

我不确定问题是我在烧瓶中生成了 html 并尝试将其发送到模板,或者我没有告诉 Jinja 如何呈现我创建并包含在 @987654334 中的 table 元素@方法。

&lt;h1&gt; test &lt;/h1&gt; 只是为了让我在发送表格时查看页面是否正在呈现。这不重要。

我认为我遇到的问题是大多数教程都过于简化了,每组文档(FlaskJinja2)都清楚地说明了等式的另一端发生了什么。我发现对flask-tableONE 解释出现在两页上,但内容相同。两者都没有建议使用模板调用它。

更新:

我现在运行时遇到 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'}]

`parse['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'

为什么日期和时间如此有趣?

【问题讨论】:

  • 您的区域设置中的 LC_TIME 似乎未配置

标签: python html flask jinja2


【解决方案1】:

您需要将时间戳转换为日期时间对象

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

【讨论】:

  • 谢谢,我会尝试一下,看看效果如何。我正在使用 DEBUG,但仍然很难找出问题所在。问题出在内容的格式上,这太疯狂了。
  • 这个方法我试过了,还是不行。我必须添加一行代码将数据强制转换为一个列表以进行迭代:raw = yaml.load(raw),在 json.loads 之前,然后我添加了您的行。我可以让它在 iPython 笔记本中转换数据,但它会抛出一个 KeyError 标志,并且在烧瓶中,错误会终止渲染。
  • 这就是 KeyError 的整个消息。当我查看数据时,它显示转换的日期。我认为python不喜欢解析后的数据格式,但我找不到任何通过Flask传递它的建议。我不确定这完全是数据格式……但其他一切看起来都正确。
  • json.loads之后尝试打印raw
  • 数据在上面,也是解析后第二个字典中的date_time值。它正在做它的工作,但不知何故,这种格式激怒了 python。我认为这与字典的预期有关。
猜你喜欢
  • 2017-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多