一犁珠、Flask簡介
Flask是一個(gè)基于python實(shí)現(xiàn)的web開發(fā)"微"框架艺演。
Flask和Django一樣戴陡,也是一個(gè)基于MVC設(shè)計(jì)模式的web框架。
官方文檔: http://flask.pocoo.org/docs/0.12/
中文文檔: http://docs.jinkan.org/docs/flask/
Flask依賴三個(gè)庫: Jinja2模板引擎押桃、Werkzeug WSGI工具集、Itsdangerous基于Django的簽名模塊
二导犹、流行的Flask
# 流行的主要原因
- 有非常齊全的官方文檔唱凯,上手非常方便
- 有非常好的擴(kuò)展機(jī)制和第三方擴(kuò)展環(huán)境,工作中常見的軟件都會(huì)有對應(yīng)的擴(kuò)展谎痢。自己動(dòng)手實(shí)現(xiàn)擴(kuò)展也是很容易的磕昼。
- 社區(qū)活躍度非常高
- 微型框架的形式給開發(fā)者更大的選擇空間
三、HelloFlask
- 安裝Flask
pip install flask
- 編輯文件
# 創(chuàng)建hello.py文件
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello Flask'
app.run()
- 運(yùn)行
python hello.py
通過pycharm創(chuàng)建flask項(xiàng)目
四节猿、項(xiàng)目啟動(dòng)參數(shù)配置
在啟動(dòng)時(shí)票从,可以在run()中添加參數(shù)
- debug是否開啟調(diào)試模式,開啟后修改python代碼會(huì)自動(dòng)重啟
- threaded是否開啟多線程
- port啟動(dòng)指定服務(wù)器端口號
- host主機(jī)滨嘱,默認(rèn)是127.0.0.1峰鄙,指定為0.0.0.0代表本機(jī)IP
app.run(debug=True, port=8000, host='0.0.0.0')
五、插件(擴(kuò)展庫)
- flask-script插件(實(shí)現(xiàn)命令行參數(shù)接受)
- 安裝插件
pip install flask-script
- 調(diào)整代碼
app = Flask(__name__)
manager = Manager(app)
- 修改啟動(dòng)方式
manager.run()
- 命令啟動(dòng)項(xiàng)目(類似Django)
python app.py runserver -r -d
# 查看幫助文檔太雨,有哪些參數(shù)
python app.py runserver --help
# 端口號
python app.py runserver -p 9000
# 調(diào)試模式
python app.py runserver -d
# 自動(dòng)重新加載
python app.py runserver -r
# 主機(jī)
python app.py runserver -h '0.0.0.0'
插件: 幫助開發(fā)者吟榴,快速實(shí)現(xiàn)某種功能
插件使用流程: 下載安裝、初始化配置
六囊扳、請求流程
七煤墙、項(xiàng)目簡單拆分(藍(lán)圖概念)
- 項(xiàng)目的簡單拆分(類似Django結(jié)構(gòu))
注意: views.py直接寫是不生效的,需要引入藍(lán)圖來解決這問題
- 藍(lán)圖概念
- 藍(lán)圖
宏觀規(guī)劃
- 藍(lán)圖是一種規(guī)劃
主要用來規(guī)劃urls(路由)
- 藍(lán)圖基本使用
- 安裝
pip install flask-blueprint
- 初始化藍(lán)圖
# views.py中創(chuàng)建
from flask import Blueprint
blue = Blueprint('first', __name__)
# 在app/__init__.py中注冊
from flask import Flask
from App.views import blue
def createapp():
app = Flask(__name__)
app.register_blueprint(blueprint=blue)
return app
- 調(diào)用藍(lán)圖進(jìn)行路由注冊
@blue.route('/')
def hello_world():
return 'Hello World!'
- 創(chuàng)建app
# 在manager.py中
from flask_script import Manager
from App import createapp
app = createapp()
manager = Manager(app)
if __name__ == '__main__':
manager.run()
八宪拥、視圖之路由
路由對應(yīng)視圖函數(shù)仿野,并且可以接收參數(shù)。
- 參數(shù)分類
- 路徑參數(shù)
位置參數(shù)
關(guān)鍵字參數(shù)
- 請求參數(shù)
get 參數(shù)在路徑中?之后
post 參數(shù)在請求體中
- 參數(shù)語法
converter: var_name
- 參數(shù)類型converter
- string 字符串
接收的時(shí)候也是string,匹配到 / 的時(shí)候是匹配結(jié)束
例如:
@blue.route('/getstudent/<string:name>/')
def getstudent(name):
print(type(name))
return '你的名字: %s' % name
- path 路徑
接收的時(shí)候也是string,而 / 只會(huì)當(dāng)作字符串中的一個(gè)字符處理
- any 任意一個(gè)
指的是any中提供的任意一個(gè)她君,類似于SQL查詢中的 in
例如: @blue.route('/getoption/<any(A,B,C):op>/')后面只能是A,B,C的其中一個(gè)
- uuid
uuid格式
例如: @blue.route('/getuser/<uuid:uu>/')
# 獲取uuid
import uuid
@blue.route('/getuuid/')
def get_uuid():
return str(uuid.uuid4())
- int
int格式
- float
float格式
默認(rèn)是string類型;
路由參數(shù)名和視圖參數(shù)名必須一致=抛鳌!
- 請求方式
- 默認(rèn)支持GET缔刹,HEAD球涛,OPTIONS
- 如果想支持某一請求方式,需要自己手動(dòng)指定
@blue.route('/requesttest/', methods=['POST','GET','PUT'])
- 反向解析
- 語法
url_for()
url_for("藍(lán)圖名.函數(shù)名")
- 例如
# 反向解析
@blue.route('/gethello/')
def gethello():
# 假設(shè)使用app就用app的名稱校镐;反之使用blue就用blue名稱
# 名稱.函數(shù)名
# blue = Blueprint('first', __name__)
p = url_for('first.hello')
return p
反向解析即是可以獲取對應(yīng)的路徑
九亿扁、視圖之Request請求
服務(wù)器在接收到客戶端請求后,會(huì)自動(dòng)創(chuàng)建Request對象鸟廓,由Flask自動(dòng)創(chuàng)建从祝,Request對象不可修改襟己。
- request.method 請求方式
- request.path 路由中的路徑
- request.args get請求參數(shù)
get請求參數(shù)的包裝,args是一個(gè)ImmutableMultiDict對象牍陌,類字典結(jié)構(gòu)對象
數(shù)據(jù)存儲也是key-value
外層是大列表擎浴,列表中的元素是元組,元組中左邊是key毒涧,右邊是value
- request.form post請求參數(shù)
存儲結(jié)構(gòu)個(gè)args一致
默認(rèn)是接收post參數(shù)
還可以接收PUT贮预,PATCH參數(shù)
- request.url 完整請求地址
- request.base_url 去掉GET參數(shù)的URL
- request.remote_addr 請求的客戶端地址
- request.file 上傳的文件
- request.headers 請求頭
- request.cookie 請求中的cookie
ImmutableMultiDict類型
ImmutableMultiDict類似字典的數(shù)據(jù)結(jié)構(gòu)
與字典的區(qū)別,可以存在相同的鍵
args契讲、form仿吞、files都是ImmutableMultiDict的對象
‘
ImmutableMultiDict數(shù)據(jù)獲取方式
dict['uname']
dict.get('uname') # 推薦(在沒有數(shù)據(jù)為空)
dict.getlist('uname') # 獲取指定key對應(yīng)的所有值
request、session是內(nèi)置對象(所有路由函數(shù)中都有)!
十捡偏、視圖之Response響應(yīng)
服務(wù)器返回給客戶端的數(shù)據(jù)茫藏。
- Response創(chuàng)建方式
- 直接返回字符串
- render_template 渲染模板,將模板轉(zhuǎn)換成字符串
- make_response 創(chuàng)建一個(gè)響應(yīng)霹琼,是一個(gè)真正的Response
- Response()創(chuàng)建
Response由開發(fā)者創(chuàng)建
- 返回配置
- 內(nèi)容
直接寫务傲,將內(nèi)容傳遞過去
@blue.route('/response/')
def get_response():
return '帶你裝逼帶你飛,帶你走進(jìn)垃圾堆!',403
- 狀態(tài)碼
字符串形式直接將狀態(tài)碼添加到return 的第二個(gè)參數(shù)
如果make形勢枣申,直接添加到make的第二個(gè)參數(shù)上
# response響應(yīng)3
@blue.route('/makeresponse/')
def make_resp():
resp = make_response('<h2>我很帥!</h2>',300)
return resp
- 返回重定向
- redirect 重定向302
- url_for 反向解析
@blue.route('/redirect/')
def make_redir():
# 固定
# return redirect('/makeresponse/')
# 反向解析
return redirect(url_for('first.make_resp'))
- 拋出異常售葡,終止程序執(zhí)行
- abort狀態(tài)碼
@blue.route('/makeabort/')
def make_abort():
# 拋出異常(4xx 5xx)
abort(404)
return '睡著了?'
- errorhandler
- 異常捕獲
- 可以根據(jù)狀態(tài)或 Exception進(jìn)行捕獲
- 函數(shù)中要包含一個(gè)參數(shù),參數(shù)用來接收異常信息
# 捕獲404異常
@blue.errorhandler(404)
def handler404(exception):
return '<h1> 我是404我怕誰V姨佟P铩! </h1>'
十一模孩、視圖之會(huì)話技術(shù)
都是來解決HTTP請求在網(wǎng)絡(luò)開發(fā)中短鏈接的問題尖阔,HTTP是無狀態(tài)的。
- Cookie
- 客戶端會(huì)話技術(shù)榨咐,瀏覽器的會(huì)話技術(shù)
- 數(shù)據(jù)全都是存儲在客戶端中
- 存儲使用的鍵值對結(jié)構(gòu)進(jìn)行的存儲(key-value)
- Cookie是通過服務(wù)器創(chuàng)建的Response來創(chuàng)建的
- cookie特性
支持過期時(shí)間
默認(rèn)會(huì)自動(dòng)攜帶本網(wǎng)站的所有cookie
根據(jù)域名進(jìn)行cookie存儲
不能跨域名
不能跨瀏覽器
- 設(shè)置cookie
respon = redirect(url_for('blue.index'))
resp.set_cookie('username',username)
- 獲取cookie
username = request.cookies.get('username','游客')
- 刪除cookie
resp = redirect(url_for('blue.user_index'))
resp.delete_cookie()
備注:
# 模板轉(zhuǎn)為字符串
tempstr = render_template('about.html', username=uu)
# 模板字符串作為 響應(yīng)對象 參數(shù)
respon = make_response(tempstr)
return respon
- Session
- 服務(wù)端的會(huì)話技術(shù)
- 所有數(shù)據(jù)存儲在服務(wù)器中
- 默認(rèn)存儲在內(nèi)存中
django默認(rèn)做了數(shù)據(jù)持久化(存在了數(shù)據(jù)庫中)
- 存儲結(jié)構(gòu)也是key-value形式介却,鍵值對(其實(shí)就是字典)
- session 是離不開cookie的
- 設(shè)置session
session['username'] = username
- 獲取session
username = session.get('username','游客')
- 刪除session
# 方式一: session是存在cookie中的
resp.delete_cookie('session')
# 方式二: 直接刪除session中對應(yīng)數(shù)據(jù)
session.pop('username')
要使用session還需要秘鑰種子SECRET_KEY,在app初始化添加進(jìn)去即可(app.config['SECRET_KEY'] = '1231231eqwedfaefdf');
- Token
- 手動(dòng)實(shí)現(xiàn)的session
- 如果在web開發(fā)中沒有cookie块茁,那么token也是不能使用的
- 脫離web前端齿坷,Token是可以使用的
傳輸給客戶端,客戶端保存
在請求的時(shí)候数焊,將token值再傳輸回來
十二永淌、session之持久化存儲
flask中這些插件幾乎并沒有干擾到之前的任何邏輯,使用起來非常的方便佩耳,就類似于中間件遂蛀。
flask中session默認(rèn)存儲在內(nèi)存中;
django中做了持久化干厚,存儲在數(shù)據(jù)庫(可以修改到redis中)李滴;
flask中沒有對默認(rèn)session進(jìn)行任何處理螃宙;
flask-session 可以實(shí)現(xiàn)session的數(shù)據(jù)持久化;
redis(緩存在磁盤上的時(shí)候悬嗓,管理磁盤文件使用lru, 最近最少使用);
- flask-session安裝
pip install flask-session
- 需要安裝redis
pip install redis
- flask-session的配置(初始化完成后,使用和之前session使用一致)
# app/__init__.py文件中
from flask_session import Session
app.config['SECRET_KEY'] = '123qdqwe123113' # 秘鑰
app.config['SESSION_TYPE'] = 'redis' # 配置
sess = Session() # 實(shí)例化session對象
sess.init_app(app) # session對象初始化
# 簡化操作: sess = Session(app)
- redis連接問題(需要啟動(dòng))
redis-server
- redis查看值
# 進(jìn)入到redis命令行
redis-cli
# 查看所有的
keys *
# 獲取對應(yīng)的值
get xxxx(key)
# 獲取時(shí)間(session的生命周期,默認(rèn)31天)
ttl xxx(key)
# 刪除對應(yīng)的值
del xxx(key)
# 刪除當(dāng)前所有的
flushdb
- session其他設(shè)置(flask-session同樣適用)
PERMANENT_SESSION_LIFETIME 設(shè)置超時(shí)時(shí)間
app.config['PERMANENT_SESSION_LIFETIME'] = 60
SESSION_COOKIE_NAME 設(shè)置會(huì)話cookie的名稱
app.config['SESSION_COOKIE_NAME'] = 'flask'
備注: 如果沒有安裝redis-server是啟動(dòng)不了的裕坊。安裝操作: sudo apt install redis
作者:西門奄
鏈接:http://www.reibang.com/u/77035eb804c3
來源:簡書
簡書著作權(quán)歸作者所有包竹,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處。