flask 是利用Python編寫的輕量級Web應(yīng)用框架
Flask也被稱為 “microframework” ,因為它使用簡單的核心,用 extension 增加其他功能。
Flask沒有默認(rèn)使用的數(shù)據(jù)庫、窗體驗證工具。
其 WSGI 工具箱采用 Werkzeug 模板引擎則使用 Jinja2 Flask使用 BSD 授權(quán)
WSGI(PythonWeb服務(wù)器網(wǎng)關(guān)接口)
Python Web Server Gateway Interface
Python應(yīng)用程序或框架和Web服務(wù)器之間的一種接口成都創(chuàng)新互聯(lián)公司專注于企業(yè)營銷型網(wǎng)站、網(wǎng)站重做改版、寬城網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5場景定制、電子商務(wù)商城網(wǎng)站建設(shè)、集團公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為寬城等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
BSD開源協(xié)議
一個給于使用者很大自由的協(xié)議,BSD 代碼鼓勵代碼共享,但需要尊重代碼作者的著作權(quán)。
創(chuàng)建一個.py文件(test.py),添加代碼如下:
# 導(dǎo)入Flask類,該類的實例將作為我們的WSGI應(yīng)用
from flask import Flask
# 實例化Flask類,第一個參數(shù)應(yīng)當(dāng)是包或者模塊名,單一模塊使用__name__即可
app = Flask(__name__)
# route裝飾器用于確定觸發(fā)函數(shù)的url
@app.route('/')
def index():
# 函數(shù)的返回值為用戶在瀏覽器中獲取的值
return 'Hello World'
運行可以直接在代碼中調(diào)用run方法,然后執(zhí)行該.py文件即可
app.run(host='0.0.0.0', port=5000)
# 0.0.0.0開放所有ip,port用于指定端口
# host指定開放ip,port指定端口號,默認(rèn)127.0.0.1(回環(huán)地址)5000端口
或者在命令行中導(dǎo)出環(huán)境變量,然后執(zhí)行
export FLASK_APP=test.py # 非當(dāng)前目錄下須添加絕對路徑
flask run # 運行
此時利用瀏覽器訪問ip+端口(如127.0.0.1:5000),可以看到Helloworld字符
注意在瀏覽器訪問時,ip后須加端口號,如果不加,默認(rèn)使用http服務(wù)(80端口)
web應(yīng)用使用有意義的url,有助于用戶理解記憶,提高用戶體驗
例如:
百度主頁:www.baidu.com
百度新聞:news.baidu.com
百度貼吧:tieba.baidu.com
上面我們用到的route裝飾器就是用來綁定url和函數(shù)
例如下面這一段表示,用戶訪問ip/時觸發(fā)的函數(shù)為index
@app.route('/')
def index():
return 'Hello World'
此外,還可以動態(tài)變化url
利用 的方式,將url的一部分標(biāo)記為變量,并傳遞給函數(shù)
@app.route('/')
def user():
return 'Hello %s'%username # 根據(jù)url變量部分返回字符串
還可以利用,選擇轉(zhuǎn)換器,為變量指定規(guī)則
@app.route('/') # 指定變量為整型
def user():
return 'Hello %s'%username
當(dāng)我們需要向用戶返回一個完善的html頁面時
如果將html源碼全部貼在return后面顯然會讓人頭疼
Flask自動為我們配置Jinja2模板引擎
我們可以利用render_template調(diào)用模板,并傳入?yún)?shù)進行渲染
@app.route('/user/')
def user():
username = 'testUser' # 測試數(shù)據(jù)
return render_template('user.html',user=username)
第一個參數(shù)為需要調(diào)用的html模板,后面?zhèn)魅腙P(guān)鍵字參數(shù)
在html中利用關(guān)鍵字訪問數(shù)據(jù)
render_template默認(rèn)會從當(dāng)前目錄下的templates文件夾中尋找模板
user.html中添加一個p標(biāo)簽,利用‘{{user}}‘的形式顯示user參數(shù)的值
利用瀏覽器訪問
大多情況下,同一個域名下的各個子頁面風(fēng)格大致相同,具有相同的框架
比如同樣的導(dǎo)航欄,底部等等
為避免重復(fù)工作,可以制作一個共用的基礎(chǔ)模板,然后通過模板繼承來實現(xiàn)共用框架
基模板(base.html)中寫好了頭部和尾部,在身體部分放置了可以重載的塊
Title
我是模板頭部
{% block body %}
可重載部分
{% endblock %}
我是模板尾部
{% extends "base.html" %} <--! 擴展了基礎(chǔ)模板 -->
{% block body %}
這是子模板新加入的內(nèi)容
{% endblock %}
如果需要在子模板中調(diào)用父模板,需要在block中使用{{ super() }}
首先導(dǎo)入請求對象
from flask import Flask
通過使用 method 屬性可以操作當(dāng)前請求方法
通過使用 form 屬性處理表單數(shù)據(jù)(在 POST 或者 PUT 請求 中傳輸?shù)臄?shù)據(jù))
在.py文件中添加代碼如下:
@app.route('/login/',methods=['POST','GET']) # methods默認(rèn)只支持GET
def login():
# 當(dāng)請求的方法為POST時
if request.method=='POST':
# 通過form表單獲取提交的數(shù)據(jù)
un = request.form['username']
pw = request.form['password']
# 判斷用戶名密碼是否正確
if un =='root' and pw =='redhat':
# 正確返回登錄成功
return '登錄成功'
else:
# 錯誤返回登錄頁面并提示
return render_template('login.html',error='用戶名或密碼錯誤')
# 請求方法不為POST時,返回登錄頁面
return render_template('login.html')
在form 表單中利用input提交信息,并指定key值(username/password)
編寫好一個簡易的登錄頁面,如下:
Title
如果需要對Url中傳遞的參數(shù)(例如ip?key=value)進行操作
可以使用request.args.get('key')
用 Flask 處理文件上傳很容易
記得要在html頁面中設(shè)置表單 enctype="multipart/form-data" 屬性
否則瀏覽器將不會傳送你的文件
在獲取原文件名時可以使用filename屬性,但該值可以偽造,不可信
想要把客戶端上源文件名作服務(wù)器上的文件名時
可以使用Werkzeug 提供的secure_filename()函數(shù)
需要導(dǎo)入
from werkzeug.utils import secure_filename
在.py文件中添加代碼如下:
from werkzeug.utils import secure_filename
@app.route('/upload/',methods=['POST','GET'])
def upload():
# 當(dāng)請求方法為POST的時
if request.method == 'POST':
# 讀取上傳的文件
try:
filename=None
f = request.files['file_upload']
# 獲取文件名
filename = secure_filename(f.filename)
# 保存文件到doc下
f.save('doc/%s'%filename)
except:
# 未獲取到文件提示上傳失敗
return render_template('upload.html',error='上傳失敗')
# 返回上傳界面,傳遞文件名
return render_template('upload.html',filename=filename)
# 返回上傳界面
return render_template('upload.html')
編寫一個簡易的上傳html界面如下:
Title
使用 redirect() 函數(shù)可以重定向
使用 abort() 可以 更早退出請求,并返回錯誤代碼
需要從flask中導(dǎo)入
from flask import abort,redirect
在.py文件中添加代碼如下:
@app.route('/error/')
def error():
abort(401) # 退出并返回一個401錯誤頁面
@app.route('/redirect/')
def direct():
return redirect('/') # 重定向至/下(顯示Helloworld)
我們還可以使用 errorhandler() 裝飾器可以定制出錯頁面,在.py中添加代碼如下:
# 定制401出錯界面為指定html 'error401.html'
@app.errorhandler(401)
def forbidden():
return render_template('error401.html')
編寫一個簡易401html錯誤界面如下:
Title
這是一個401錯誤頁面
視圖函數(shù)(即被route裝飾器裝飾的函數(shù))的返回值 會自動轉(zhuǎn)換為一個響應(yīng)對象
轉(zhuǎn)換規(guī)則:
- 如果視圖返回的是一個響應(yīng)對象,那么就直接返回它。
- 如果返回的是一個字符串,那么根據(jù)這個字符串和缺省參數(shù)生成一個用于返回的 響應(yīng)對象。
- 如果返回的是一個元組,那么元組中的項目可以提供額外的信息。元組中必須至少 包含一個項目,且項目應(yīng)當(dāng)由 (response, status, headers) 或者 (response, headers) 組成。 status 的值會重載狀態(tài)代碼, headers 是一個由額外頭部值組成的列表或字典。
- 如果以上都不是,那么 Flask 會假定返回值是一個有效的 WSGI 應(yīng)用并把它轉(zhuǎn)換為 一個響應(yīng)對象。
如果想要在視圖函數(shù)內(nèi)部獲取響應(yīng)對象的結(jié)果,可以使用make_response()函數(shù)
參考資料
官方中文文檔