Python Flask模塊

模塊是一個包含響應文本的文件,其中包含佔用位變量表示的動態部分,其具體值只在請求的上下文中才知道。使用真實值替換變量,再返回最終獲得的響應字符串,這一過程稱爲渲染。爲了渲染模塊,Flask使用一個名爲Jinja2的強大模板引擎。html

 

1、Jinja2模板引擎

形式最簡單的Jinja2模板就是一個包含響應文本的文件。python

<h1>Hello,World!</h1>
<h1>Hello,{{name}}!</h1>

一、渲染模板flask

默認狀況下,Flask在程序文件夾中的templates子文件夾中尋找模板。在下一個hello.py版本中,要把前面定義的模板保存在templates文件夾中,並分別命名爲index.html和user.html。bootstrap

#!/usr/bin/env python

from flask import Flask,render_template
app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/user/<name>')
def user(name):
    return render_template('user.html',name=name)

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

Flask提供的render_template函數把Jinja模塊引擎集成到了程序中。api

 

二、變量服務器

模板中使用的{{name}}結構表示一個變量,它是一種特殊的佔位符,告訴模板引擎這個位置的值從渲染模板時使用的數據中獲取。架構

Jinja2能識別全部類型的變量,甚至是一些複雜的類型,例如列表、字典和對象。在模板中使用變量的一些實例以下app

<p>a value from a dictionary: {{ mydict['key'] }}</p>
<p>a value from a list:{{ mylist[3] }}</p>
<p>a value from a list,with a varliable index:{{ mylist[myintavr] }}</p>
<p>a value from a objects method:{{ myobj.somemethod() }}</p>

Jinja2變量過濾器函數

過濾器名 說明
safe 、渲染時不轉義
capitalize
把值得首字母轉換成大寫,其餘字母轉換成小寫
lower 把值轉換成小寫形式
upper 把值轉換成大寫形式
title 把值中每一個單詞的首字母都轉換成大寫
trim 把值的首位空格去掉
striptags 渲染以前把值中全部HTML標籤都刪除

 

三、控制結構url

在模板中使用條件控制語句:

{% if user %}
    Hello,{{ user }}!
{% else %}
    Hello,Stranger!
{% endif %}
<ul>
    {% for commet in commets %}
        <li>{{ commet }}</li>
    {% end for %}
</ul>

Jinja2還支持宏,相似於Python代碼中的函數。例如:

{% macro render_commet(commet) %}
    <li>{{ commet }}</li>
{% endmacro %}

<ul>
    {% for commet in commets %}
        {{ render_commet(commet) }}
    {% endfor %}
</ul>

爲了重複使用宏,咱們能夠將其保存在單獨的文件中,而後在須要使用的模板中導入:

{% import 'macros.html' as macros %}
<ul>
    {% for commet in commets %}
        {{ macros.render_commet(commet) }}
    {% endfor %}
</ul>

另外一種重複使用代碼的強大方式是模板繼承,它相似於Python代碼中的類繼承。首先建立一個名爲base.html的基模板:

<html>
<head>
    {% block head %}
    <title>{% block title %}{% endblock %} - My Application</title>
    {% endblock %}
</head>
<body>
    {% block body %}
    {% endblock %}
</body>
</html>

 

2、使用Flask-Bootstrap集成Twitter Bootstrp

Bootstrap是客戶端架構,所以不會直接涉及服務器。服務器要作的知識提供引用了Bootstrap層疊樣式表(CSS)和Javascript文件的HTML響應,並在HTML/CSS和Javascript代碼中實例化所需組件。這些操做最理想的執行場所就是模板。

#初始化 Flask-bootstrap

from flask.ext.bootstrap import Bootstrap
#...
bootstrap = Bootstrap(app)

初始化Flask-Bootstrap以後,就能夠在程序中使用一個包含全部Bootstrap文件的基模板。

{% extends "bootstrap/base.html" %}

{% block title %}Flasky{% endblock %}

{% block navbar %}
<div class="navbar navbar-inverse" role="navigation">
    <div class="container">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle"
            data-toggle="collapse" data-target=".navbar-collapse">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="/">Flasky</a>
        </div>
        <div class="navbar-collapse collapse">
            <ul class="nav navbar-nav">
                <li><a href="/">Home</a></li>
            </ul>
        </div>
    </div>
</div>
{% endblock %}

{% block content %}
<div class="container">
    <div class="page-header">
        <h1>Hello,{{ name }}!</h1>
    </div>
</div>
{% endblock %}

 

3、自定義錯誤界面

#自定義錯誤界面

#!/usr/bin/env python

from flask import Flask,render_template
app = Flask(__name__)

@app.errorhandler(404)
def page_not_found(e):
    return render_template('404.html'),404

@app.errorhandler(500)
def internal_server_error(e):
    return render_template('500.html'),500

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

 

四:連接

Flask提供url_for()輔助函數,它可使用程序URL映射中保存的信息生成URL。

url_for()函數最簡單的用法是以視圖函數名(或者app.add_url_route()定義路由時使用的端點名)做爲參數,返回對應的URL。

使用url_for()生成動態地址時,將動態部分做爲關鍵字參數傳入。例如,url_for('user',name='john',_external=True)

 

5、靜態文件

默認設置下,Flask在程序根目錄中名爲static的子目錄中尋找靜態文件。若是須要,可在static文件夾中使用子文件夾存放文件。

#定義收藏夾圖標
{% block head %}
{{ super() }}
<link rel="shortcut icon" href="{{ url_for('static',filename='favicon.ico') }}"
    type="image/x-icon">
<link rel="icon" href="{{ url_for('static',filename='favicon.ico') }}"
    type="image/x-icon">
{% endblock %}

 

6、使用Flask-Moment本地化日期和時間

Flask-Moment是一個Flask程序擴展,能把moment.js集成到Jinja2模板中。

#初始化Flask-Moment
from flask.ext.moment import Moment
moment = Moment(app)
#引入moment.js庫
{% block scripts %}
{{ super() }}
{{ moment.include_moment() }}
{% endblock %}
#!/usr/bin/env python

from flask import Flask,render_template
app = Flask(__name__)

from datetime import datetime
from flask_moment import Moment

moment = Moment(app)
@app.route('/')
def index():
    return render_template('index.html',
                           current_time=datetime.utcnow())

if __name__ == '__main__':
    app.run()
相關文章
相關標籤/搜索