資源:
Flakl-SQLAlchemy快速入門
Flask中文文檔網(wǎng)頁
Tornado中文文檔網(wǎng)頁
1. Flask介紹
2. 安裝flask
3. 基于flask的最小的應(yīng)用
4. 管理啟動項(xiàng)目 Manager
5. Blueprint(藍(lán)圖)
6. 請求與響應(yīng)
7. 異常捕獲
8. 路徑(route)規(guī)則
1. Flask介紹
Flask是一個基于Python實(shí)現(xiàn)的web開發(fā)的'微'框架
Flask和Django一樣,也是一個基于MVC設(shè)計(jì)模式的Web框架
flask流行的主要原因:
a. 有非常齊全的官方文檔慎冤,上手非常方便
b. 有非常好的拓展機(jī)制和第三方的拓展環(huán)境砌创,工作中常見的軟件都有對應(yīng)的拓展虏缸,自己動手實(shí)現(xiàn)拓展也很容易
c. 微型框架的形式給了開發(fā)者更大的選擇空間
2. 安裝flask
2.1. 虛擬環(huán)境搭建
virtualenv --no-site-packages flaskenv
激活windows下虛擬環(huán)境
cd Scripts
activate
2.2. 安裝
pip install flask
2.3.使用
用PyCharm 項(xiàng)目文件夾,選擇配置的虛擬環(huán)境
3. 基于flask的最小的應(yīng)用
創(chuàng)建hello.py
文件
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World'
?
if __name__ == '__main__':
app.run()
運(yùn)行:python hello.py
3.1. 初始化
app = Flask(__name__)
Flask類構(gòu)造函數(shù)唯一需要的參數(shù)就是應(yīng)用程序的主模塊或包。對于大多數(shù)應(yīng)用程序嫩实,Python的__name__變量就是那個正確的刽辙、你需要傳遞的值。Flask使用這個參數(shù)來確定應(yīng)用程序的根目錄甲献,這樣以后可以相對這個路徑來找到資源文件宰缤。
3.2. 路由
@app.route('/')
客戶端例如web瀏覽器發(fā)送 請求 給web服務(wù),進(jìn)而將它們發(fā)送給Flask應(yīng)用程序?qū)嵗?yīng)用程序?qū)嵗枰缹τ诟鱾€URL請求需要運(yùn)行哪些代碼慨灭,所以它給Python函數(shù)建立了一個URLs映射朦乏。這些在URL和函數(shù)之間建立聯(lián)系的操作被稱之為 路由 。
在Flask應(yīng)程序中定義路由的最便捷的方式是通過顯示定義在應(yīng)用程序?qū)嵗系腶pp.route裝飾器氧骤,注冊被裝飾的函數(shù)來作為一個路由
3.3 視圖函數(shù)
在上一個示例給應(yīng)用程序的根URL注冊hello_world()函數(shù)作為事件的處理程序呻疹。如果這個應(yīng)用程序被部署在服務(wù)器上并綁定了 www.example.com 域名,然后在你的瀏覽器地址欄中輸入 http://www.example.com 將觸發(fā)gello_world()來運(yùn)行服務(wù)筹陵」舸福客戶端接收到的這個函數(shù)的返回值被稱為 響應(yīng) 。如果客戶端是web瀏覽器惶翻,響應(yīng)則是顯示給用戶的文檔姑蓝。
類似于hello_world()的函數(shù)被稱作: 視圖函數(shù) 。
3.4. 動態(tài)名稱組件路由
你的Facebook個人信息頁的URL是 http://www.facebook.com/<username> 吕粗,所以你的用戶名是它的一部分。Flask在路由裝飾器中使用特殊的語法支持這些類型的URLs旭愧。下面的示例定義了一個擁有動態(tài)名稱組件的路由:
@app.route('/hello/<name>')
def gello_world(name):
return 'Hello World %s' % name
用尖括號括起來的部分是動態(tài)的部分颅筋,所以任何URLs匹配到靜態(tài)部分都將映射到這個路由。當(dāng)視圖函數(shù)被調(diào)用输枯,F(xiàn)lask發(fā)送動態(tài)組件作為一個參數(shù)议泵。在前面的示例的視圖函數(shù)中,這個參數(shù)是用于生成一個個性的問候作為響應(yīng)桃熄。
在路由中動態(tài)組件默認(rèn)為字符串先口,但是可以定義為其他類型。例如瞳收,路由/user/<int:id>只匹配有一個整數(shù)在id動態(tài)段的URLs碉京。Flask路由支持int、float
3.5. 服務(wù)啟動
if __name__ == '__main__':
app.run()
注意: __name__ == '__main__'在此處使用是用于確保web服務(wù)已經(jīng)啟動當(dāng)腳本被立即執(zhí)行螟深。當(dāng)腳本被另一個腳本導(dǎo)入谐宙,它被看做父腳本將啟動不同的服務(wù),所以app.run()調(diào)用會被跳過界弧。
一旦服務(wù)啟動凡蜻,它將進(jìn)入循環(huán)等待請求并為之服務(wù)。這個循環(huán)持續(xù)到應(yīng)用程序停止垢箕,例如通過按下Ctrl-C划栓。
有幾個選項(xiàng)參數(shù)可以給app.run()配置web服務(wù)的操作模式。在開發(fā)期間条获,可以很方便的開啟debug模式忠荞,將激活 debugger 和 reloader 。這樣做是通過傳遞debug為True來實(shí)現(xiàn)的。
run()中參數(shù)有如下:
debug 是否開啟調(diào)試模式钻洒,開啟后修改python的代碼會自動重啟
port 啟動指定服務(wù)器的端口號
host主機(jī)奋姿,默認(rèn)是127.0.0.1
a. 運(yùn)行默認(rèn)IP == 127.0.0.1:5000
b. app.run(port=8080, host= '0.0.0.0', debug=True)
4. 管理啟動項(xiàng)目 Manager
4.1. 安裝插件
pip install flask-script
調(diào)整代碼
from flask_script import Manager
manager = Manager(app=‘自定義的flask對象’)
if __name__ == '__main__':
manager.run()
4.2. 啟動命令
python hellow.py runserver -h 地址 -p 端口 -d -r
其中:-h表示地址。-p表示端口素标。-d表示debug模式称诗。-r表示自動重啟
5. Blueprint(藍(lán)圖)
5.1. 什么是藍(lán)圖
在Flask項(xiàng)目中可以用Blueprint(藍(lán)圖)實(shí)現(xiàn)模塊化的應(yīng)用蛾坯,使用藍(lán)圖可以讓應(yīng)用層次更清晰痊末,開發(fā)者更容易去維護(hù)和開發(fā)項(xiàng)目责蝠。藍(lán)圖將作用于相同的URL前綴的請求地址秒梳,將具有相同前綴的請求都放在一個模塊中咱士,這樣查找問題蚁飒,一看路由就很快的可以找到對應(yīng)的視圖榛鼎,并解決問題了乞封。
5.2. 使用藍(lán)圖
a. 安裝
`pip install flask_blueprint`
b 實(shí)例化藍(lán)圖應(yīng)用
from flask import Blueprint
blue = Blueprint(‘first’,__name__)
注意:Blueprint中傳入了兩個參數(shù)鲫惶,第一個是藍(lán)圖的名稱蜈首,第二個是藍(lán)圖所在的包或模塊,name代表當(dāng)前模塊名或者包名
c 注冊
app = Flask(__name__)
app.register_blueprint(blue, url_prefix='/user')
注意:第一個參數(shù)即我們定義初始化定義的藍(lán)圖對象欠母,第二個參數(shù)url_prefix表示該藍(lán)圖下欢策,所有的url請求必須以/user開始。這樣對一個模塊的url可以很好的進(jìn)行統(tǒng)一管理
5.3 使用藍(lán)圖
修改視圖上的裝飾器赏淌,修改為@blue.router(‘/’)
@blue.route('hello/', methods=['GET', 'POST'])
def hello():
# 視圖函數(shù)
return 'Hello World'
url為127.0.0.1:5000/user/hello/
5.4 跳轉(zhuǎn)路徑
from flask import render_template, redirect, url_for
a. 跳轉(zhuǎn)到template中html文件
return render_template('xxx.html', name1=value1, name2=value2)
b. 目標(biāo)路徑 path
return redirect('/app/hello_world/')
c. 反向解析
url_for('藍(lán)圖的第一個參數(shù).跳轉(zhuǎn)到某個函數(shù)的函數(shù)名')
return redirect(url_for('first.hello'))
6. 請求與響應(yīng)
常用的請求類型有如下幾種
類型 | 說明 |
---|---|
GET | 獲取 |
POST | 創(chuàng)建 |
PUT | 修改(全部屬性都修改) |
DELETE | 刪除 |
PATCH | 修改(修改部分屬性) |
6.1. 請求: 客戶端傳到服務(wù)端
request
如果是GET請求: 獲取get請求中的參數(shù),使用request.args.get('key')
如果是POST / PUT / PATCH / DELETE 請求: 獲取請求中的參數(shù),使用request.form.get('key');
getlist('key') - 獲取key重復(fù)的value值,結(jié)果是列表
@blueprint.route('request/', methods=['GET', 'POST', 'PUT', 'PATCH', 'DELETE'])
def get_request():
request
return 'i am request'
6.2. 響應(yīng): 是服務(wù)端返回給客戶端的
比如設(shè)置cookie值
from flask import make_response
make_response
@blueprint.route('response/', methods=['GET'])
def get_response():
res = make_response('<h2>i am response</h2>', 200)
return res
7. 異常捕獲
7.1. abort() - 拋出異常
from flask import abort
@blueprint.route('error/', methods=['get'])
def error():
a = 9
b = 0
try:
c = a / b
except:
abort(500)
return '%s/%s=%s'(a, b, c)
7.2. errohandler() - 捕獲異常
@blueprint.errorhandler(500)
def handler_500(exception):
return '捕捉異常信息: %s' % exception
8. 路徑(route)規(guī)則
8.1. 規(guī)則
寫法:<converter:variable_name>
類型 | 說明 |
---|---|
string | 字符串 |
int | 整形 |
float | 浮點(diǎn)型 |
path | 接受路徑踩寇,接收的時候是str,/也當(dāng)做字符串的一個字符 |
uuid | 只接受uuid字符串 |
any | 可以同時指定多種路徑六水,進(jìn)行限定 |
例子:
# route匹配規(guī)則
# 1. <string:xxx> 獲取到xxx的參數(shù)的值為字符串類型
# 2. <xxx> 默認(rèn)獲取到xxx的參數(shù)的值為字符串類型
# 3. <int:xxx> 獲取到的xxx的參數(shù)的值為整型類型
# 4. <float:xxx> 獲取到的xxx的參數(shù)的值為浮點(diǎn)型
# 5. <path:xxx> 獲取到的xxx的參數(shù)的值為路徑后面的全部url地址
# 6. <uuid:xxx> 獲取到的xxx的參數(shù)的值為uuid格式: 06c2a195-13ce-44a0-2453-cc6b0e7e08c4
@blueprint.route('name/<string:s_name>/')
def get_name(s_name):
return '姓名:%s' % s_name
@blueprint.route('age/<age>/')
def get_age(age):
return 'age:%s' % age
@blueprint.route('int_age/<int:age>')
def get_int_age(age):
return '年齡:%s' % age
@blueprint.route('float/<float:number>')
def get_float_number(number):
return '浮點(diǎn)型:%.2f' % number
# 獲取path后面的所有路徑: /s3r/324/sff/..
@blueprint.route('path/<path:s_path>')
def get_path(s_path):
return '路徑: %s' % s_path
@blueprint.route('get_uuid/')
def get_uuid():
a = uuid.uuid4()
return 'uuid: %s' % str(a)
@blueprint.route('uuid/<uuid:s_uuid>')
def get_by_uuid(s_uuid):
return '獲取uuid: %s' % s_uuid