render_template() 方法可以渲染模板,你只要提供模板名稱和你需要的參數作為參數傳遞給模板的變量就行了。
例子:template.py
from flask import render_template@app.route('/hello/')@app.route('/hello/')def hello(name=None): return render_template('hello.html', name=name)
文件結構如下:
/template.py/templates /hello.html
Flask 會在 templates 文件夾內尋找hello.html模板。
因此,如果你的應用是一個模塊,那么模板文件夾(templates)應該在模塊旁邊;如果是一個包,那么就應該在包里面:
情形 1: 一個模塊:
/application.py/templates /hello.html
情形 2: 一個包:(有 init .py)
/application /__init__.py /templates /hello.html
運行template.py
官網
開發者文檔
模板包含 變量 或 表達式 ,這兩者在模板求值的時候 會被替換為值 。模板中 還有標簽,控制模板的邏輯。模板語法的大量靈感來自于 Django 和 Python 。
例子:
Hello from Flask {% if name %}Hello {{ name }}!
{% else %}Hello World!
{% endif %}
3行:如果name為真,則顯示Hello + name參數
5行:否則顯示hello world
7行:結束判斷
多行
{# ... #}
單行
## 為行注釋前綴
模板引擎不會對空白做處理,空白(空格、制表符、換行符 等等)都會原封不動返回。
在塊(比如一個for 標簽、一段注釋或變量表達式)的開始或結束放置一個減號( - ),可以移除塊前或塊后的空白:標簽和減號之間不能有空白
有效的:
{%- if foo -%}...{% endif %}
無效的:
{% - if foo - %}...{% endif %}
使用 # 把一個行標記為一個語句,下面的兩段代碼等價
# for item in seq
不會把它作為變量或塊來處理。
最簡單的方法是在變量分隔符中( {{ )使用變量表達式輸出:
{{ '{{' }}
較大的段落使用raw:
{% raw %} {% for item in seq %}
Hello, {{ name }}!
特殊的占位符告訴模版引擎該值在渲染模版的時候要從數據提供者那里拿到該數據。
Jinja2可以識別所有變量的類型,甚至是一些復雜的數據類型,如lists,dic,objects.如:
A value from a dictionary: {{ mydict['key'] }}.
A value from a list: {{ mylist[3] }}.
A value from a list, with a variable index: {{ mylist[myintvar] }}.
A value from an object's method: {{ myobj.somemethod() }}.
變量上面也可以有你能訪問的屬性或元素。訪問變量屬性可以使用 . 或者 []
{{ foo.bar }}{{ foo['bar'] }}
變量可以被過濾器修改,通過管道|作為分隔符,過濾器放在后面
Hello, {{ name|capitalize }}
Filter名稱 | 描述 |
---|---|
safe | 安全過濾器 |
capitalize | 值的第一個字符轉換為大寫,其余小寫 |
lower | 值全部轉化為小寫 |
upper | 值全部轉換為大寫 |
title | 值中的每個單詞大寫 |
trim | 將中間的空格移除 |
striptags | 在渲染之前刪除任何HTML標記 |
安全過濾器:
所有的判斷函數
{% if loop.index is divisibleby 3 %}
Jinja2提供了幾個控制流結構改變渲染模版的流。
{% for user in users %}
迭代像 dict 的容器
{% for key, value in my_dict.iteritems() %} {{ key|e }} {{ value|e }}{% endfor %}
include 語句用于包含一個模板,并在當前命名空間中返回那個文件的內容渲 染結果
模板繼承可以使每個頁面的特定元素(如頁頭,導航,頁尾)保持一致。
用內容填充空的block是子模板的工作。 {% block %}告訴模板引擎子模板可以覆蓋模板中的這些部分。
同一個模板中 {% block %} 的名名稱必須唯一。
一個基礎的模版:base.html
{% block head %}{% block title %}{% endblock %} - My Webpage {% endblock %} {% block content %}{% endblock %} {% block footer %} © Copyright 2008 by you. {% endblock %}
子模版:{% extend %} 標簽告訴模板引擎這個模板“繼承”另一個模板。 extends 標簽應該是模板中的第一個 標簽。
{% extends "base.html" %}{% block title %}Index{% endblock %}{% block head %} {{ super() }} {% endblock %}{% block content %}Index
Welcome on my awesome homepage.
{% endblock %}
重復使用塊,渲染塊的內容:使用 self.塊的名稱
{% block title %}{% endblock %} {{ self.title() }}
{% block body %}{% endblock %}
{% block sidebar %}Table Of Contents
... {{ super() }}{% endblock %}
Jinja2 允許你在塊的結束標簽中加入的名稱來改善可讀性:endblock 后面的名稱一定與塊名匹配。
{% block sidebar %} {% block inner_sidebar %} ... {% endblock inner_sidebar %}{% endblock sidebar %}
默認的塊不允許訪問塊外作用域中的變量,下面的li輸出為空,item 在塊中是不可用的,其原因是,如果 塊被子模板替換,變量在其塊中可能是未定義的或未被傳遞到上下文。
{% for item in seq %}
在塊聲明中添加 scoped 修飾,就把塊設定到作用域中:
{% for item in seq %}
bootstrap官網
bootstrap是客戶端的模版,所以服務器不能直接調用它。服務器能夠做的就是提供HTML response,根據bootstrap需要的html,css,js關聯的組建。使用Flask-Bootstrap擴展來完成。
安裝Flask-Bootstrap: pip install flask-bootstrap
初始化Bootstrap
Flask擴展的初始化一般都是在app實例創建的同時實行。
from flask.ext.bootstrap import Bootstrap# ...bootstrap = Bootstrap(app)
下面展示新的繼承模版
{% extends "bootstrap/base.html" %}{% block title %}Flasky{% endblock %}{% block navbar %} Flasky
定義了三個block,title, navbar, 和content.在這個模版中navbar block定義了一個簡單的導航bar使用bootstrap組建。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com