【Python Flask】 Web開發學習筆記——模版

書籍:《Flask Web開發:基於Python的Web應用開發實戰》

作者代碼地址:miguelgrinberg/flasky

書中說:

“視圖函數的作用很明確,即生成請求的響應,如第 2 章中的示例所示。對最簡單的請求來說,這就足夠了,但一般而言,請求會改變程序的狀態,而這種變化也會在視圖函數中產生。”

“例如,用戶在網站中註冊了一個新賬戶。用戶在表單中輸入電子郵件地址和密碼,然後點擊提交按鈕。 服務器接收到包含用戶輸入數據的請求,然後 Flask 把請求分發到處理註冊請求的視圖函數。 這個視圖函數需要訪問數據庫,添加新用戶,然後生成響應回送瀏覽器。這兩個過程分別稱爲業務邏輯表現邏輯。”

這裏我理解的表現邏輯類似於三層開發中的數據訪問層,如下是百度百科的解釋:

“所謂的三層開發就是將系統的整個業務應用劃分爲表示層,業務邏輯層和數據訪問層,這樣有利於系統的開發、維護、部署和擴展。

分層是爲了實現“高內聚,低耦合”。採用“分而治之”的思想,把問題劃分開來各個解決,易於控制,延展和分配資源。

業務邏輯層負責系統領域業務的處理,負責邏輯性數據的生成、處理及轉換。對所輸入的邏輯性數據的正確性及有效性負責,但對輸出的邏輯性數據及用戶性數據的正確性不負責,對數據的呈現樣式不負責。”

不過也有可能這裏理解有誤 OvO 因爲標準數據訪問層的定義是實現對數據庫的各種訪問功能,這裏又不太一樣。

 

Flask的模版:

模版:是一個包含響應文本的文件。把表現邏輯移到模版中可提高程序的可維護性。

Flask使用Jinja2模型渲染引擎。這裏所謂的渲染就是將URL中可變部分的值進行替換然後得到最終的響應字符串。

變量:在模版中使用{{ name }},name即是一個變量,在進行渲染模版時傳入這個參數。

Jinja2能夠識別所有類型變量,包括列表,字典,甚至是對象。

<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 variable index: {{ mylist[myintvar] }}.</p>
<p>A value from an object's method: {{ myobj.somemethod() }}.</p>

上面的第四行即是一個對象的方法。

過濾器:用於修改變量的一個東西。Hello, {{ name|capitalize }},可以將name變量的值以首字母大寫的方式顯示,其中的capitalize就是一個過濾器名。

控制結構:Jinja2中實現的可以用來改變模版的渲染流程的控制結構,例如:

條件控制語句:

{% if user %}
    Hello, {{ user }}!
{% else %}
    Hello, Stranger!
{% endif %}

for循環語句:

<ul>
    {% for comment in comments %}
        <li>{{ comment }}</li>
    {% endfor %}
</ul>

模版還可以使用宏,甚至進行模版繼承。

 

自定義錯誤頁面:使用app.errorhandler()裝飾器:

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

 

靜態文件:例如HTML中的圖片,JavaScript源碼文件,CSS都是靜態文件。

{% 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 %}

其中,url_for()函數使用程序URL映射中保存的信息生成URL。這裏的作用就是取得靜態文件favicon.ico的URL地址。

更多文章與筆記請關注:微信公衆號:二進制樹

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章