【问题标题】:Formatting flask-table output with html on python在 python 上使用 html 格式化烧瓶表输出
【发布时间】:2020-08-20 13:03:31
【问题描述】:

这里不是一个非常有经验的python用户,只是在家中学习了python。我正在研究将烧瓶表的输出集成到网站。以下是我的 python 代码,它为我的网站创建了一个简单的表。

    from flask_table import Table, Col

    app = Flask(__name__)

    class ItemTable(Table):
        name = Col('Name')
        description = Col('Description')

    Class Item(object):
        def __init__(self, name, description):
            self.name = name
            self.description = description

    items = [dict(name='Name1', description='Description1'),
             dict(name='Name2', description='Description2'),
             dict(name='Name3', description='Description3')]

    table = ItemTable(items)


    @app.route("/")
    def hello():
        return render_template('index.html', tStrToLoad=table.__html__())

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

还有我的 html 代码,它从上面的 python 代码中获取 tStrToLoad 来显示。

<html>
    <head>
        <title>Test Flask Table</title>
        <style>
            body 
            {
                background-color: #000000;
                color: #FFFFFF;
                font-family:Verdana;
                font-size:16px;
            }
            table, th, td
            {
                border: 1px solid #0088ff;
                border-collapse: collapse;
                padding: 3px;
                font-family:Verdana;
                font-size:12px;
                text-align: left;
            }

        </style>
    </head>
    <body>
        a simple test table
        <br/><br/>

        {{ tStrToLoad }}

    </body>
</html>

我没有显示包含数据的表格,而是在黑色背景中显示以下输出

a simple test table

<table> <thead><tr><th>Name</th><th>Description</th></tr></thead> <tbody> <tr><td>Name1</td><td>Description1</td></tr> <tr><td>Name2</td><td>Description2</td></tr> <tr><td>Name3</td><td>Description3</td></tr> </tbody> </table>

经过进一步调查,我做了一个查看页面源代码,这是我由此产生的实际 html 代码。

<html>
    <head>
        <title>Test Flask Table</title>
        <style>
            body 
            {
                background-color: #000000;
                color: #FFFFFF;
                font-family:Verdana;
                font-size:16px;
            }
            table, th, td
            {
                border: 1px solid #0088ff;
                border-collapse: collapse;
                padding: 3px;
                font-family:Verdana;
                font-size:12px;
                text-align: left;
            }

        </style>
    </head>
    <body>
        a simple test table
        <br/><br/>

        &lt;table&gt;
&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Name&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Name1&lt;/td&gt;&lt;td&gt;Description1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Name2&lt;/td&gt;&lt;td&gt;Description2&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Name3&lt;/td&gt;&lt;td&gt;Description3&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

    </body>
</html>

我的问题是如何在我的 python 脚本中正确格式化它,以便它发送 > 而不是 & lt;>

【问题讨论】:

    标签: python html flask-table


    【解决方案1】:

    如果您确信表中的所有数据都没有未经验证的用户输入,请告诉 Jinja 不要转义 html:

    {{ tStrToLoad | safe }}
    

    但是,您可能希望避免使用 Flask-tables,而只需自己传递项目列表。如果您还在单独的列表中传递一些标题,则模板代码可以变得更加通用:

            headers = ['Name','Description']
            return render_template('index.html',
                                   headers = headers,
                                   objects = items)
    

    然后手动建表:

    {% if objects %}
      <table id='result' class='display'>
        <thead>
          <tr>
          {% for header in headers %}
            <th>{{header}}</th>
          {% endfor %}
          </tr>
        </thead>
    
        <tbody>
        {% for object in objects %} 
          <tr>
        {% for k, val in object.items() %}
            <td>{{val}}</td>
          {% endfor %}
          </tr>
        {% endfor %}        
        </tbody>
      </table>
    {% endif %}
    

    如您所见,这使您不必将任何值硬编码到模板中。

    该表的语法也与数据表兼容,因此如果您按照zero configuration 示例加载 CSS 和 JS 文件,那么您的表会变得更漂亮,并且可以具有内置的搜索栏和分页。如果您需要有关如何执行此操作的进一步指导,请告诉我。

    【讨论】:

    • 成功了!正是我需要的!谢啦!这里不会有任何用户输入,所以我不必清理输入。
    • 这部分代码你叫什么? {% if objects %},我想了解更多。谢谢!
    • @Rascal 这是Jinja2 templating syntax 中的if 子句。
    • @Rascal 旁注:避免在模板中构建复杂的逻辑,这些逻辑并不严格需要在模板中完成。开始时,可​​能很想将{% if somevar %}FOO{% else %}BAR{% endif %} 之类的东西放在模板中。这一直有效,直到您希望在 Python 程序中的其他位置基于somevar 获得FOOBAR。尽量让模板保持显示逻辑。
    猜你喜欢
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    相关资源
    最近更新 更多