如何理解Python運(yùn)維開發(fā)中的Flask框架,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。
創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比安岳網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式安岳網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋安岳地區(qū)。費(fèi)用合理售后完善,10余年實(shí)體公司更值得信賴。
相信曾經(jīng)糾結(jié)過這個(gè)問題:怎樣才能徹底掌握flask?
Flask是一個(gè)使用 Python 編寫的輕量級(jí) Web 應(yīng)用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎則使用 Jinja2 。Flask使用 BSD 授權(quán)。
Flask也被稱為 “microframework” ,因?yàn)樗褂煤?jiǎn)單的核心,用 extension 增加其他功能。Flask沒有默認(rèn)使用的數(shù)據(jù)庫、窗體驗(yàn)證工具。
今天我們邀請(qǐng)到了多年從事Python開發(fā)的不動(dòng)老師,讓他為我們帶來flask開發(fā)的一線實(shí)戰(zhàn)。
分享開始
大家好,下面現(xiàn)在開始分享flask開發(fā),先看下本次分享的內(nèi)容:
1、Flask Web框架介紹
Flask是微型web框架,框架本身十分精簡(jiǎn),微型并不代表其功能弱,核心代碼基于Werkzeug, Jinja 2 這兩個(gè)庫,它以插件形式的進(jìn)行功能擴(kuò)展,且插件易于安裝與使用,并且可以自行開發(fā)擴(kuò)展插件
與其他web框架類似,flask中請(qǐng)求(request),路由(route),響應(yīng)(response)構(gòu)成其完整的一個(gè)基本http流程。
2、作為入門flask框架非常易于使用
了解其基本結(jié)構(gòu)后,可以迅速進(jìn)行MVC開發(fā),或者將其當(dāng)作后端restfulApi來響應(yīng)數(shù)據(jù)。
***步:我們先來用虛擬環(huán)境安裝flask
虛擬環(huán)境,將當(dāng)前運(yùn)行環(huán)境完全與系統(tǒng)的python環(huán)境進(jìn)行隔離,這里我們使用pyenv這個(gè)庫來進(jìn)行構(gòu)建環(huán)境
以centos系統(tǒng)為例安裝虛擬環(huán)境:
1、yum install zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel
2、curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer
| bash
配置環(huán)境變量, 在 ~/.bash_profile里增加如下內(nèi)容:
export PATH="~/.pyenv/bin:$PATH“ eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)“
第二步 :在生成虛擬環(huán)境 激活此pyenv
1、系統(tǒng)中一般自帶的python版本是python2.7.10
2、我們自行下載一個(gè)python版本是2.7.12
3、使用sohu的鏡像源:http://mirrors.sohu.com/python/
找到python版本是2.7.12的包下載到本地
為何需要使用虛擬環(huán)境? 因?yàn)樘摂M環(huán)境對(duì)于每一個(gè)python環(huán)境來說是獨(dú)立開來的,用虛擬環(huán)境可以在一臺(tái)機(jī)器上運(yùn)行多個(gè)項(xiàng)目時(shí),每個(gè)項(xiàng)目的環(huán)境是隔離,不產(chǎn)生依賴。
4、如需其他版本也可以下載對(duì)應(yīng)的版本放到~/.pyenv/cache文件夾下面(cache文件夾假如不存在,自行創(chuàng)建)
5、然后執(zhí)行 pyenv install 版本號(hào) 安裝對(duì)應(yīng)的python版本: pyenv install 2.7.12
6、安裝2.7.12版本成功后,創(chuàng)建一個(gè)目錄為完全隔離的python虛擬環(huán)境:
pyenv virtualenv 2.7.12 venv27
mkdir -pv virtu
cd virtu pyenv local venv27 cd .. cd virtu 自動(dòng)激活了venv27環(huán)境
第三步:安裝pip
Pip是一個(gè)用來安裝python第三方庫的工具
sudo yum -y install epel-release (安裝yum包擴(kuò)展)
sudo yum –y install pip
使用阿里云的python包加速pip安裝
Pip 配置阿里云鏡像:
mkdir ~/.pip
vim ~/.pip/pip.conf, 輸入以下內(nèi)容
[global] index-url=http://mirrors.aliyun.com/pypi/simple/
trusted-host=mirrors.aliyun.com
第四步:安裝flask:
cd vnvn27 (剛才構(gòu)建的虛擬環(huán)境,切換到了一個(gè)完全虛擬環(huán)境)
Pip install flask
Pip freeze 列出當(dāng)前安裝的第三方python庫以及版本
運(yùn)行python終端,import flask,可以測(cè)試是否安裝flask成功
2.0:wsgi規(guī)范
Python使用wsgi網(wǎng)關(guān)進(jìn)行Web開發(fā),flask基于wsgi網(wǎng)關(guān),flask中實(shí)例的app,也稱之為一個(gè)wsgi 應(yīng)用
Wsgi是python中定義的一種網(wǎng)關(guān)協(xié)議規(guī)范,pep333對(duì)此的相關(guān)解釋: https://www.python.org/dev/peps/pep-0333/
from wsgiref.simple_server import make_server
wsgiref包是實(shí)現(xiàn)了wsgi標(biāo)準(zhǔn)的一個(gè)參考,我們可以用它來進(jìn)行調(diào)試,此包一般用于測(cè)試環(huán)境,不建議生產(chǎn)環(huán)境中使用。
simple_server實(shí)現(xiàn)了一個(gè)簡(jiǎn)易的http服務(wù)器,我們可以用它來運(yùn)行一個(gè)wsgi應(yīng)用
2.1:wsgi規(guī)范2
下面示例我們可以用wsgiref這個(gè)包實(shí)現(xiàn)一個(gè)簡(jiǎn)單的wsgi web框架來理解其工作流程:
2.2:wsgi規(guī)范3
上面的代碼中,我們使用了wsgiref包簡(jiǎn)易的實(shí)現(xiàn)了一個(gè)wsgiweb框架,其中我們依據(jù)傳入的env中獲取到url后綴來匹配router字典中對(duì)應(yīng)的處理函數(shù)
Env參數(shù)是包含了客戶端請(qǐng)求的信息和服務(wù)端的環(huán)境信息,可以將其打印出來,看下其中包含的變量。
Start_response函數(shù)作為參數(shù)傳入runserver應(yīng)用中,必須要start_response(status,header)來進(jìn)行響應(yīng),它是由網(wǎng)關(guān)接口定義的函數(shù)。
在上述中可以看出,wsgi的作用是在web服務(wù)器和web應(yīng)用之間的橋梁,web服務(wù)器監(jiān)聽將客戶端請(qǐng)求轉(zhuǎn)發(fā)給實(shí)現(xiàn)wsgi規(guī)范接口處理,wsgi接將請(qǐng)求進(jìn)行中轉(zhuǎn)給上層的web應(yīng)用處理,web應(yīng)用處理完成并生成響應(yīng)返回給wsgi接口,然后web服務(wù)器將收到的響應(yīng)返回給客戶端。
2.3:一個(gè)最基本應(yīng)用
Flask框架也是依據(jù)上面的規(guī)范實(shí)現(xiàn)的web框架,我們可以看下flask源碼中對(duì)于上述的封裝,不過它做了更高層次的抽象
可以看到flask源碼中使用wsgi_app和魔術(shù)方法__call__對(duì) 上述start_respones做了封裝。
接下里用flask運(yùn)行一個(gè)hello wordl
2.4:一個(gè)最基本應(yīng)用分析
/usr/bin/env python from Flask import flask app = Flask(__name__) @app.route('/') def index(): return ‘<h2>Hello World!</h2>‘ if __name__ == '__main__': app.run() python hello.py
2.5:最基本應(yīng)用
app = Flask(__name__) 代碼使用Flask類生成一個(gè)應(yīng)用實(shí)例
@app.route('/') def index(): return ‘<h2>hello world</h2>’
一個(gè)http過程中請(qǐng)求來自客戶端,http服務(wù)器(nginx,Apache)再次將請(qǐng)求轉(zhuǎn)發(fā)給flask應(yīng)用實(shí)例app,@app.route(‘/)中映射了url鏈接與一個(gè)python函數(shù)的對(duì)應(yīng)關(guān)系,我們將index函數(shù)稱之為視圖函數(shù)。
比如訪問192.168.1.19
---》app.route(‘/’)
訪問192.168.1.19/blog
---》app.route(‘/blog’)
2.6:可變url
在一般業(yè)務(wù)中,url都是動(dòng)態(tài)可變的,在flask中我們這樣設(shè)置可變url
@app.route(‘/hello/<name>’) def hello(name): return ‘<h2>hello {}’.format(name)
示例:
訪問192.168.1.19/hello/jack
訪問192.168.1.19/hello/rose
<name> 被尖括號(hào)抱起來的部分代表url中與python處理函數(shù)中對(duì)應(yīng)的可變部分.
常用的有以下3種,定義可變的類型
<string:name>、<int:uid>、<path:prefix>
2.7:可變url自定義裝換器
定義可變url,除了上述的string之外,還有以下幾種int、float、path這三種,另外flask還可以通過werkzeug中的BaseConverter類,自定義轉(zhuǎn)換器。
這里自定義一個(gè)轉(zhuǎn)換器
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)
將自定義轉(zhuǎn)換器加入到app應(yīng)用url_map中,當(dāng)客戶端輸入?yún)?shù)時(shí),可以以,我們自行設(shè)置的分隔符做轉(zhuǎn)換
app.url_map.converters['list'] = ListConverter @app.route('/home/<list:subs>') def home(subs): # 使用自定義類型 htm = '' for sub in subs: htm += '<h2>{}</h2>'.format(sub) return htm
在生產(chǎn)環(huán)境中客戶端到服務(wù)端,使用python開發(fā)應(yīng)用的一般流程是如下圖所示:
flask中的請(qǐng)求,請(qǐng)求是web開發(fā)中最重要特性之一
3.0 Flask入門:請(qǐng)求
from flask import request @app.route(‘/hi’) def hi(): name = request.args.get(‘name’) return ‘<h2>hi {}</h2>’.format(name)
訪問:
192.168.1.19/hi?name=mike
flask中request對(duì)象封裝了客戶端的請(qǐng)求參數(shù)
我們可以嘗試將print(request.__dict__)查看請(qǐng)求上下文環(huán)境變量
request請(qǐng)求對(duì)象是flask內(nèi)部封裝的一個(gè)全局對(duì)象,這個(gè)對(duì)象是線程隔離的,必須運(yùn)行在當(dāng)前請(qǐng)求中的上下文,直接運(yùn)行會(huì)報(bào)錯(cuò),它通過werkzeug模塊中l(wèi)ocalproxy在localstack這種數(shù)據(jù)結(jié)構(gòu)尋找當(dāng)前請(qǐng)求
常見的request客戶端變量
request.args 獲取從客戶端url傳輸過來的查詢字符串
request.form 獲取從客戶端表單提交過來的信息
request.json 獲取從客戶端從請(qǐng)求body獲取的json字符串
request.method 獲取客戶端使用的請(qǐng)求方法
Request.files 獲取從客戶端請(qǐng)求過來的文件
3.1 Flask入門:響應(yīng)與會(huì)話
from flask import make_respones
flask中封裝了make_response作為客戶端響應(yīng),返回http頭信息、狀態(tài)碼等,resp = make_respone(‘hello’.encode()),resp.set_cookie(‘name’, ‘jack’) ,將resp作為返回,可以手動(dòng)靈活的增加了cookie
會(huì)話分為客戶端和服務(wù)端2種形式,from flask importsession 中封裝了基于客戶端的cookies,示例如下:
在app.config對(duì)象中保存了flask的默認(rèn)配置以及我們項(xiàng)目中寫入的配置變量,通常情況下flask中的一些配置如下
4.1 flask中的讀入配置
app = Flask(__name__)
app.config.from_object(‘yourapplication.default_settings’)
app.config.from_pyfile(’config.cfg’)
上面兩種都可以將配置文件加入到app應(yīng)用當(dāng)中,其中app.config.from_object()方法會(huì)尋找配置文件為類的配置
用函數(shù)封裝配置文件寫入app,這樣可以依據(jù)參數(shù)來區(qū)分開發(fā)環(huán)境與生產(chǎn)環(huán)境的配置文件。
4.2工廠方法創(chuàng)建app
什么是工廠方法?工廠方法是一種設(shè)計(jì)模式,這里使用可以簡(jiǎn)單理解為通過一個(gè)函數(shù)來批量創(chuàng)建一個(gè)flask app對(duì)象,依據(jù)不同的參數(shù)來生成不同的app
4.3為何需要工廠方法創(chuàng)建app?
當(dāng)需要運(yùn)行app的時(shí)候,可以通過工廠方法傳遞參數(shù)來生成不同的app對(duì)象,方便的進(jìn)行測(cè)試不同的app,并且生成多個(gè)app的時(shí)候可以進(jìn)行分別進(jìn)行請(qǐng)求處理,流量負(fù)載等,通過以下示例說明
5.0鉤子函數(shù)
flask中鉤子函數(shù)作用是將被裝飾的函數(shù)注冊(cè)到app當(dāng)中,在不同階段執(zhí)行。
app.first_request: 在***次請(qǐng)求之前執(zhí)行
app.before_request: 在每次請(qǐng)求之前執(zhí)行,可以用它來封裝中間鍵,效果類似于django middleware
app.after_request: 在每次請(qǐng)求之后執(zhí)行
app.teardown_appcontext: 不管是否有異常出現(xiàn),都會(huì)在每次請(qǐng)求之后執(zhí)行
app.errorhandler:接受狀態(tài)碼,并且自定義返回錯(cuò)誤處理信息頁面
5.1鉤子函數(shù)before_request
5.2鉤子函數(shù)errorhandler
5.3藍(lán)圖
藍(lán)圖將應(yīng)用進(jìn)行模塊化,能夠很方便的將不同的功能和路由區(qū)分開,并且易于維護(hù),藍(lán)圖基于相同的url前綴來作區(qū)分。
功能類似的視圖函數(shù)組合在一起作為藍(lán)圖的組件,將應(yīng)用進(jìn)行分割,極大簡(jiǎn)化了大型應(yīng)用的復(fù)雜度,藍(lán)圖要注冊(cè)到app對(duì)象中,藍(lán)圖的使用方式與app的使用方式很像
藍(lán)圖提供模板過濾器、靜態(tài)文件、模板和其它功能
5.4藍(lán)圖生成
將user這些相似的功能分成一個(gè)藍(lán)圖模塊,注意藍(lán)圖文件不能和藍(lán)圖對(duì)象同名,否則會(huì)沖突報(bào)錯(cuò)
5.5藍(lán)圖注冊(cè)
v 當(dāng)以上user實(shí)例化時(shí),必須將此注冊(cè)到app應(yīng)用中,藍(lán)圖才能生效,url_prefix為自定義添加的url后綴
6.0flask擴(kuò)展使用
v flask以插件形式開發(fā)擴(kuò)展功能,其中許多優(yōu)秀第三方插件可以直接使用,提升開發(fā)效率,常見項(xiàng)目開發(fā)用到的插件有flask_sqlachemy、flask_redis、flask_login、flask_admin等等
v 插件安裝一般使用 pip install <插件名>,即可安裝
v 以下示例flask_sqlachemy使用,flask_sqlachemy是sqlalchemy的flask插件,sqlalchemy是python界有名的工業(yè)級(jí)orm框架
6.1flask_sqlalchemy
v 實(shí)例化flask_sqlalchemy,生成db對(duì)象后續(xù)初始化到app中
6.2flask插件初始化
v 由于db對(duì)象需要讀取app應(yīng)用中配置,并且依賴app上下文工作,所以將上述db對(duì)象等擴(kuò)展插件初始化app,在每次app啟動(dòng)之前完成綁定
6.3 flask_sqlalchemy定義model
使用上述db對(duì)象,model字段繼承db.Model,在mvc中此表示model層,用來進(jìn)行數(shù)據(jù)庫表字段映射關(guān)聯(lián)以及數(shù)據(jù)寫入保存等.
6.4 flask_sqlalchemy進(jìn)行用戶驗(yàn)證
使用flask可以輕松開發(fā)應(yīng)用,每一種web框架都有其自身利弊,對(duì)于現(xiàn)代web開發(fā)的需求來說,微框架很適合快速迭代式開發(fā),***的理解的方法是實(shí)踐,可以依據(jù)以上對(duì)flask有一個(gè)大體理解之后進(jìn)行一個(gè)簡(jiǎn)單的應(yīng)用開發(fā)。
關(guān)于如何理解Python運(yùn)維開發(fā)中的Flask框架問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
標(biāo)題名稱:如何理解Python運(yùn)維開發(fā)中的Flask框架
標(biāo)題來源:http://chinadenli.net/article44/gshphe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、自適應(yīng)網(wǎng)站、網(wǎng)站設(shè)計(jì)公司、Google、外貿(mào)建站、網(wǎng)站排名
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)