相信曾經糾結過這個問題:怎樣才能完全掌握flask?python
Flask是一個使用 Python 編寫的輕量級 Web 應用框架。其 WSGI 工具箱採用 Werkzeug ,模板引擎則使用 Jinja2 。Flask使用 BSD 受權。nginx
Flask也被稱爲 「microframework」 ,由於它使用簡單的核心,用 extension 增長其餘功能。Flask沒有默認使用的數據庫、窗體驗證工具。git
今天咱們邀請到了多年從事Python開發的不動老師,讓他爲咱們帶來flask開發的一線實戰。github
不動:馬哥教育Python實戰開發講師團特邀講師,多年python開發經驗,重度flask使用者,當前從事 O2Oweb商城後端開發和運維開發的工做。web
分享開始redis
你們好,下面如今開始分享flask開發,先看下本次分享的內容:sql
一、Flask Web框架介紹數據庫
Flask是微型web框架,框架自己十分精簡,微型並不表明其功能弱,核心代碼基於Werkzeug, Jinja 2 這兩個庫,它以插件形式的進行功能擴展,且插件易於安裝與使用,而且能夠自行開發擴展插件django
與其餘web框架相似,flask中請求(request),路由(route),響應(response)構成其完整的一個基本http流程。json
二、做爲入門flask框架很是易於使用
瞭解其基本結構後,能夠迅速進行MVC開發,或者將其看成後端restfulApi來響應數據。
第一步咱們先來用虛擬環境安裝flask
虛擬環境,將當前運行環境徹底與系統的python環境進行隔離,這裏咱們使用pyenv這個庫來進行構建環境
以centos系統爲例安裝虛擬環境:
一、yum install zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel
二、curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer
| bash
配置環境變量, 在 ~/.bash_profile裏增長以下內容:
export PATH="~/.pyenv/bin:$PATH「
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)「
第二步 :在生成虛擬環境 激活此pyenv
一、系統中通常自帶的python版本是python2.7.10
二、咱們自行下載一個python版本是2.7.12
三、使用sohu的鏡像源:http://mirrors.sohu.com/python/
找到python版本是2.7.12的包下載到本地
爲什麼須要使用虛擬環境? 由於虛擬環境對於每個python環境來講是獨立開來的,用虛擬環境能夠在一臺機器上運行多個項目時,每一個項目的環境是隔離,不產生依賴。
四、如需其餘版本也能夠下載對應的版本放到~/.pyenv/cache文件夾下面(cache文件夾假如不存在,自行建立)
五、而後執行 pyenv install 版本號 安裝對應的python版本: pyenv install 2.7.12
六、安裝2.7.12版本成功後,建立一個目錄爲徹底隔離的python虛擬環境:
pyenv virtualenv 2.7.12 venv27
mkdir -pv virtu
cd virtu pyenv local venv27 cd .. cd virtu 自動激活了venv27環境
第三步 安裝pip
Pip是一個用來安裝python第三方庫的工具
sudo yum -y install epel-release (安裝yum包擴展)
sudo yum –y install pip
使用阿里雲的python包加速pip安裝
Pip 配置阿里雲鏡像:
mkdir ~/.pip
vim ~/.pip/pip.conf, 輸入如下內容
[global] index-url=http://mirrors.aliyun.com/pypi/simple/
trusted-host=http://mirrors.aliyun.com
第五步安裝flask:
cd vnvn27 (剛纔構建的虛擬環境,切換到了一個徹底虛擬環境)
Pip install flask
Pip freeze 列出當前安裝的第三方python庫以及版本
運行python終端,import flask,能夠測試是否安裝flask成功
2.0:wsgi規範
Python使用wsgi網關進行Web開發,flask基於wsgi網關,flask中實例的app,也稱之爲一個wsgi 應用
Wsgi是python中定義的一種網關協議規範,pep333對此的相關解釋: https://www.python.org/dev/peps/pep-0333/
from wsgiref.simple_server import make_server
wsgiref包是實現了wsgi標準的一個參考,咱們能夠用它來進行調試,此包通常用於測試環境,不建議生產環境中使用。
simple_server實現了一個簡易的http服務器,咱們能夠用它來運行一個wsgi應用
2.1:wsgi規範2
下面示例咱們能夠用wsgiref這個包實現一個簡單的wsgi web框架來理解其工做流程:
2.2:wsgi規範3
上面的代碼中,咱們使用了wsgiref包簡易的實現了一個wsgiweb框架,其中咱們依據傳入的env中獲取到url後綴來匹配router字典中對應的處理函數
Env參數是包含了客戶端請求的信息和服務端的環境信息,能夠將其打印出來,看下其中包含的變量。
Start_response函數做爲參數傳入runserver應用中,必需要start_response(status,header)來進行響應,它是由網關接口定義的函數。
在上述中能夠看出,wsgi的做用是在web服務器和web應用之間的橋樑,web服務器監聽將客戶端請求轉發給實現wsgi規範接口處理,wsgi接將請求進行中轉給上層的web應用處理,web應用處理完成並生成響應返回給wsgi接口,而後web服務器將收到的響應返回給客戶端。
2.3:一個最基本應用
Flask框架也是依據上面的規範實現的web框架,咱們能夠看下flask源碼中對於上述的封裝,不過它作了更高層次的抽象
能夠看到flask源碼中使用wsgi_app和魔術方法__call__對 上述start_respones作了封裝。
接下里用flask運行一個hello wordl
2.4:一個最基本應用分析
/usr/bin/env python
from Flask import flask
app = Flask(__name__)
@app.route('/')
def index():
return ‘<h1>Hello World!</h1>‘
if __name__ == '__main__':
app.run()
python hello.py
2.5:最基本應用
app = Flask(__name__) 代碼使用Flask類生成一個應用實例
@app.route('/')
def index():
return ‘<h1>hello world</h1>’
一個http過程當中請求來自客戶端,http服務器(nginx,Apache)再次將請求轉發給flask應用實例app,@app.route(‘/)中映射了url連接與一個python函數的對應關係,咱們將index函數稱之爲視圖函數。
好比訪問192.168.1.19
---》app.route(‘/’)
訪問192.168.1.19/blog
---》app.route(‘/blog’)
2.6:可變url
在通常業務中,url都是動態可變的,在flask中咱們這樣設置可變url
@app.route(‘/hello/<name>’)
def hello(name):
return ‘<h1>hello {}’.format(name)
示例:
訪問192.168.1.19/hello/jack
訪問192.168.1.19/hello/rose
<name> 被尖括號抱起來的部分表明url中與python處理函數中對應的可變部分.
經常使用的有如下3種,定義可變的類型
<string:name>、<int:uid>、<path:prefix>
2.7:可變url自定義裝換器
定義可變url,除了上述的string以外,還有如下幾種int、float、path這三種,另外flask還能夠經過werkzeug中的BaseConverter類,自定義轉換器。
這裏自定義一個轉換器
fromwerkzeug.routing import BaseConverter
classListConverter(BaseConverter):
def to_python(self, value):
return value.split('+')
def to_url(self, values):
return'+'.join(BaseConverter.to_url(value) for value in values)
將自定義轉換器加入到app應用url_map中,當客戶端輸入參數時,能夠以,咱們自行設置的分隔符作轉換
app.url_map.converters['list'] = ListConverter
@app.route('/home/<list:subs>')
def home(subs):
# 使用自定義類型
htm = ''
for sub in subs:
htm += '<h1>{}</h1>'.format(sub)
return htm
在生產環境中客戶端到服務端,使用python開發應用的通常流程是以下圖所示:
flask中的請求,請求是web開發中最重要特性之一
3.0 Flask入門:請求
from flask import request
@app.route(‘/hi’)
def hi():
name = request.args.get(‘name’)
return ‘<h1>hi {}</h1>’.format(name)
訪問:
192.168.1.19/hi?name=mike
flask中request對象封裝了客戶端的請求參數
咱們能夠嘗試將print(request.__dict__)查看請求上下文環境變量
request請求對象是flask內部封裝的一個全局對象,這個對象是線程隔離的,必須運行在當前請求中的上下文,直接運行會報錯,它經過werkzeug模塊中localproxy在localstack這種數據結構尋找當前請求
常見的request客戶端變量
request.args 獲取從客戶端url傳輸過來的查詢字符串
request.form 獲取從客戶端表單提交過來的信息
request.json 獲取從客戶端從請求body獲取的json字符串
request.method 獲取客戶端使用的請求方法
Request.files 獲取從客戶端請求過來的文件
3.1 Flask入門:響應與會話
from flask import make_respones
flask中封裝了make_response做爲客戶端響應,返回http頭信息、狀態碼等,resp = make_respone(‘hello’.encode()),resp.set_cookie(‘name’, ‘jack’) ,將resp做爲返回,能夠手動靈活的增長了cookie
會話分爲客戶端和服務端2種形式,from flask importsession 中封裝了基於客戶端的cookies,示例以下:
在app.config對象中保存了flask的默認配置以及咱們項目中寫入的配置變量,一般狀況下flask中的一些配置以下
4.1 flask中的讀入配置
app = Flask(__name__) app.config.from_object(‘yourapplication.default_settings’) app.config.from_pyfile(’config.cfg’)
上面兩種均可以將配置文件加入到app應用當中,其中app.config.from_object()方法會尋找配置文件爲類的配置
用函數封裝配置文件寫入app,這樣能夠依據參數來區分開發環境與生產環境的配置文件。
4.2工廠方法建立app
什麼是工廠方法?工廠方法是一種設計模式,這裏使用能夠簡單理解爲經過一個函數來批量建立一個flask app對象,依據不一樣的參數來生成不一樣的app
4.3爲什麼須要工廠方法建立app?
當須要運行app的時候,能夠經過工廠方法傳遞參數來生成不一樣的app對象,方便的進行測試不一樣的app,而且生成多個app的時候能夠進行分別進行請求處理,流量負載等,經過如下示例說明
5.0鉤子函數
flask中鉤子函數做用是將被裝飾的函數註冊到app當中,在不一樣階段執行。
app.first_request: 在第一次請求以前執行
app.before_request: 在每次請求以前執行,能夠用它來封裝中間鍵,效果相似於django middleware
app.after_request: 在每次請求以後執行
app.teardown_appcontext: 不論是否有異常出現,都會在每次請求以後執行
app.errorhandler:接受狀態碼,而且自定義返回錯誤處理信息頁面
5.1鉤子函數before_request
5.2鉤子函數errorhandler
5.3藍圖
藍圖將應用進行模塊化,可以很方便的將不一樣的功能和路由區分開,而且易於維護,藍圖基於相同的url前綴來做區分。
功能相似的視圖函數組合在一塊兒做爲藍圖的組件,將應用進行分割,極大簡化了大型應用的複雜度,藍圖要註冊到app對象中,藍圖的使用方式與app的使用方式很像
藍圖提供模板過濾器、靜態文件、模板和其它功能
5.4藍圖生成
將user這些類似的功能分紅一個藍圖模塊,注意藍圖文件不能和藍圖對象同名,不然會衝突報錯
5.5藍圖註冊
v 當以上user實例化時,必須將此註冊到app應用中,藍圖才能生效,url_prefix爲自定義添加的url後綴
6.0flask擴展使用
v flask以插件形式開發擴展功能,其中許多優秀第三方插件能夠直接使用,提高開發效率,常見項目開發用到的插件有flask_sqlachemy、flask_redis、flask_login、flask_admin等等
v 插件安裝通常使用 pip install <插件名>,便可安裝
v 如下示例flask_sqlachemy使用,flask_sqlachemy是sqlalchemy的flask插件,sqlalchemy是python界有名的工業級orm框架
6.1flask_sqlalchemy
v 實例化flask_sqlalchemy,生成db對象後續初始化到app中
6.2flask插件初始化
v 因爲db對象須要讀取app應用中配置,而且依賴app上下文工做,因此將上述db對象等擴展插件初始化app,在每次app啓動以前完成綁定
6.3 flask_sqlalchemy定義model
使用上述db對象,model字段繼承db.Model,在mvc中此表示model層,用來進行數據庫表字段映射關聯以及數據寫入保存等.
6.4 flask_sqlalchemy進行用戶驗證
以上介紹了flask中入門開發常見的問題以及模塊使用,歡迎你們拍磚。
使用flask能夠輕鬆開發應用,每一種web框架都有其自身利弊,對於現代web開發的需求來講,微框架很適合快速迭代式開發,最好的理解的方法是實踐,能夠依據以上對flask有一個大致理解以後進行一個簡單的應用開發。