一、Flask簡介
Flask 是一個Python編寫的一種輕量級的框架,只提供了web框架基本的功能,比其他的框架更加靈活、自由
二、Flask的安裝
框架開發的時候,兼容性是一個很大的問題
開發環境:Python3.7版本,Flask1.1.1 版本
-
虛擬環境的使用
工作中會根據需求,在Python環境下使用各種框架和包,但是可能每個項目使用的框架和版本不一樣,這樣就要根據需要更新和卸載相應的庫,為了不必要的麻煩,便於管理,使用虛擬環境
-
anaconda虛擬環境的安裝,創建指定Python版本的環境
conda create -n flask_env python=3,7
flask_env:環境的名字,任意,有閱讀性
Python=3.7:指定Python的版本
-
激活進入/離開虛擬環境
conda active flask_env
conda deacticve
-
進入虛擬環境,下載flask
pip install flask==1.1.1
查看當前環境下的包
pip freeze
二、創建Flask項目
-
實現最小應用
使用 pycharm 創建一個項目project01,設置Python虛擬環境
-
路由
Flask 根據 HTTP 請求的url在路由表中匹配定義好的路由規則,找到對應的函數處理請求。
在這個過程中需要保存一個url到行數的映射關系,我們把處理url到函數之間的關系成為路由
flask中的路由是使用裝飾器的形式定義的,並且必須是/開頭,否則報錯
-
視圖函數
視圖函數是處理用戶的請求,返回響應的函數代碼塊
在Flask中視圖函數的名字不能重復
-
啟動服務器
run啟動參數 | 說明 |
---|---|
host | 主機地址,默認是127.0.0.1,運行外部ip地址訪問,0.0.0.0 |
port | 端口號,默認是5000 |
debug | 調試模式,默認為false,開發的時候一般設置為true,這樣有視圖有錯誤,在瀏覽器中顯示,方便調試錯誤。項目上線需要改為false。也可以啟動重啟代碼。 |
use_reloader | 是否自動重啟代碼,默認為false,true為自定義 |
-
url路徑參數(動態路由)
可以通過請求的url中獲取需要的參數。例如:現在定義一個路由/users/,如果請求的url為/users/1,表明想要獲取編號為1的用戶信息,則這里的1就是請求中傳遞的參數
@app.route('/users/<sid>') def hello_world(sid): return '查詢id是{}的用戶信息'.format(sid)
上面代碼中<>即為轉換器語法,默認為字符串類型,即匹配到的內容始終為字符串類型
Flask中其他類型轉換器
轉換器類型 | 使用 |
---|---|
string字符串類型 | < string:name > |
int整數類型 | < int:name > |
float小數類型 | < float:name > |
path路徑類型 | < path:name > |
三、Flask模板系統
flask默認采用是jinja2模板進行模板渲染,jinja2是python第三方的一個模板渲染模塊,通常用於flask,tornado框架中,jinja2的開發大量參考了django的模板渲染系統,相似度達到98%
靜態文件:css,js,img等這些都是靜態文件,flask中默認加載當前目錄下的static目錄下的靜態文件
模板文件:flask默認當前目錄下的templates目錄下的模板文件
- 調用靜態頁面
- 新建一個templates目錄,存放了html文件
- 導入from flask import render_template模塊,調用靜態頁面
@app.route('/index')
def hello_world():
return render_template("index.html")
-
視圖傳遞參數到模板
如果使用這種方式傳遞參數,如果變量的數量多的情況下,使用起來不方便,可以使用解包將函數內的所有變量傳遞到模板中。
html頁面參數語法:{{name}}
@app.route('/index')
def hello_world():
name = "老王"
age = 33
gender = "男"
return render_template("index.html",name=name,age=age,gender=gender)
@app.route('/index')
def hello_world():
name = "老王"
age = 33
gender = "男"
return render_template("index.html", **locals())
-
模板語法
-
變量的使用
語法:{{變量名}},jinja2模板引擎支持python中基本數據類型,類變量等
變量可以根據索引或者 . 取出來
jinja2模板引擎可以使用一些python提供的一些方法。例如:upper,replace,lower等方法
比如:{{p.name.replace("老","小")}}
-
控制語句
(1) if語句
{% if 條件%}
{% elif 條件 %}
{% else %}
{% endif %}
(2) for循環
{% for 變量 in 可迭代對象 %}
{% endfor %}
-
#if控制語句
{% if age<18 %}
未成年
{% elif age<50 %}
青壯年
{% else %}
老年
{% endif %}
#for循環
{% for i in hobby %}
{{ i }}
{% endfor %}
{% for k,v in info.items() %}
{{ k }}-{{ v }}
{% endfor %}
{% for i in hobby %}
{% if loop.index%2 == 0 %}
{{ loop.index0 }}:{{ i }}
{% else %}
{{ loop.index0 }}:{{ i }}
{% endif %}
{% endfor %}
(3) loop
在for循環中,jinja2還提供一個特殊變量,用來獲取當前的遍歷狀態
方法 | 說明 |
---|---|
loop.index | 當前迭代的索引(從1開始) |
loop.index0 | 當前迭代的索引(從0開始) |
loop.first | 是否是第一次迭代,返回bool |
loop.last | 是否是最后一次迭代,返回bool |
loop.length | 序列中項目的數目 |
-
過濾器
過濾器本質是函數,可以使用過濾器將視圖傳遞過來的值進行修改顯示的效果
jinja2提供的常見過濾器:
{{ nick_name | capitalize }}
{{ nick_name | upper }
{{ nick_name | replace("ni","NI") }}
方法 | 說明 |
---|---|
capitialize | 首字母轉換成大寫,其他字母轉換為小寫 |
lower | 轉換成小寫形式 |
upper | 轉換成大寫形式 |
title | 每個單詞的首字母都轉換成大寫 |
replace | 替換字符串的值 |
round | 對數字進行四舍五入 |
safe | 渲染時值不轉義 |
- 自定義過濾器
- 定義過濾器函數
- 注冊過濾器函數(函數的名字,過濾器的名字)
#自定義過濾器
def my_add(num1, num2):
return num1 + num2
app.add_template_filter(my_add, "myadd")
四、靜態文件
在全棧開發過程中,把css,js,img等非html內容看做是靜態內容
在網站有很多資源不存在數據庫中,直接放在服務器上,那么這樣的資源叫做靜態資源
flask在開發過程中,靜態文件需要放在默認的靜態位置(當前腳本目錄下的static目錄,並且在html中,使用/static/來代替目錄)
五、模板繼承與加載
針對網站所有的頁面通常使用一個模板,由於風格和需求導致,所有頁面都相同的部分,為了減少代碼冗余,方便代碼修改,出現了繼承和加載兩種機制
1、繼承:
當我們瀏覽器一個網站的時候發現里面有大部分是相同的,這時候我們為了去除代碼的冗余,使用繼承。
(1) 定義父模板,在父模板中定義block
(2) 在子模板中繼承,根據需要實現父模板中的block
2、包含
將可以常用的頁面內容如導航條,尾頁信息等不變的組件可以保存到單獨的文件中,然后在需要使用敵方按照如下語法導入即可。
#繼承
{% extends "father.html" %}
{% block title %}{% endblock %}
#包含
{% include "myblock.html" %}