標籤:

Jinja2動態生成周報

整理下最近做的一個小工作,用Python寫定時生成部門周報。

  1. 編寫markdown template
  2. 使用jinja渲染markdown
  3. Python的md2html實現生成html
  4. flask server顯示

首先,在有道雲寫一個weekly_report.md,注意的是,markdown原生不支持table,需要自己在markdown手動畫一個html

{% for s in project_list -%}<br> {{s}}</br>{% endfor %}

由於周報會經常接收各種輸入,因此套用jinja2的模式,把需要傳參進來的變數用{{s}}來代替。特別是對於不確定長度的列表或字典,這種寫法非常感人。

<table border="1"> <tr> <th>風險描述</th> <th>優先順序</th> <th>備註</th> <th>風險狀態</th> <th>上報日期</th> </tr> {% for risk in risk_list %} <tr> <td>{{risk.desc}}</td> <td>{{risk.priority}}</td> <td>{{risk.comment}}</td> <td>{{risk.status}}</td> <td>{{risk.data}}</td> </tr> {% endfor %} </table>

接著是用jinja2渲染markdown模板了。

第一步,創建一個環境變數 。

env = Environment(loader=FunctionLoader(load_templates))

第二步,載入模板,渲染數據 ,通過render()方法,傳入字典或者關鍵字參數來擴展模板。

tpl = env.get_template(template_file)return tpl.render(_vars)

然後,使用Python的markdown庫,來生成html。

html = markdown.markdown(tpl)

到這一步,一個可以動態入參的html就生成了。那麼如何在頁面動態顯示呢?恩,flask!幾行代碼輕鬆實現!

from flask import Flask, render_templatefrom flask_apscheduler import APSchedulerhtml_file = index.htmlapp = Flask(__name__)@app.route(/weekly_report, methods=[GET])def render_html(): return render_template(html_file)if __name__ == __main__: app.run(host="0.0.0.0")

最後,輸入127.0.0.1:5000/weekly_r 來看看頁面效果吧~


推薦閱讀:

哪種文本標記語言更好用?
普通文檔流的數字串遇到浮動塊為什麼不自動換行而是直接流到浮動塊底部的一行?
為什麼a標籤中使用img後的高度多了幾個像素?
為什麼前端盡量少用iframe?
html中這幾個符號實體什麼意思,我怎麼查都查不到?

TAG:Python | HTML |