python編程Flask框架簡(jiǎn)單使用教程
基礎(chǔ)知識(shí)
使用框架的優(yōu)點(diǎn)
穩(wěn)定性和可擴(kuò)展性強(qiáng)
可以降低開(kāi)發(fā)難度,提高了開(kāi)發(fā)效率
Flask誕生于2010年,是Armin ronacher用Python語(yǔ)言基于Werkzeug工具箱編寫(xiě)的輕量級(jí)Web開(kāi)發(fā)框架
Flask本身相當(dāng)于一個(gè)內(nèi)核,其他幾乎所有的功能都要用到擴(kuò)展(郵件擴(kuò)展Flask-Mail,用戶(hù)認(rèn)證Flask-Login,數(shù)據(jù)庫(kù)Flask-SQL_Alchemy),都需要用第三方的擴(kuò)展來(lái)實(shí)現(xiàn)。
其WSGI工具箱采用Werkzeug(路由模塊),模塊引擎則使用Jinja2.這兩個(gè)也是Flask框架的核心
Flask常用擴(kuò)展包
| Flask-SQLalchemy | 操作數(shù)據(jù)庫(kù) |
|---|---|
| Flask-script | 插入腳本 |
| Flask-migrate | 管理遷移數(shù)據(jù)庫(kù) |
| Flask-Session | Session存儲(chǔ)方式指定 |
| Flask-WTF | 表單 |
| Flask-Mail | 郵件 |
| Flask-Bable | 提供國(guó)際化和本地化支持,翻譯; |
| Flask-Login | 認(rèn)證用戶(hù)狀態(tài); |
| Flask-OpenID | 認(rèn)證; |
| Flask-RESTful | 開(kāi)發(fā)REST API的工具; |
| Flask-Bootstrap | 集成前端Twitter Bootstrap框架 |
| Flask-Moment | 本地化日期和時(shí)間 |
| Flask-Admin | 簡(jiǎn)單而可擴(kuò)展的管理接口的框架 |
擴(kuò)展列表:http://shouce.jb51.net/flask0.10/extensions.html
1.中文文檔(http://shouce.jb51.net/flask0.10/index.html)
2.英文文檔(http://flask.pocoo.org/docs/0.11/)
基本格式
from flask import Flask
app=Flask(__name__)
@app.route('/')
def a():
return 'aa'
app.run()
打開(kāi)谷歌 網(wǎng)址為你的ip地址后加上:再加上默認(rèn)的端口號(hào)5000 頁(yè)面展示為aa
app.run(host='0.0.0.0',port=80,debug=True)
host:設(shè)置為'0.0.0.0'時(shí)在同一個(gè)局域網(wǎng)別的電腦ip都能訪問(wèn),不設(shè)置這個(gè)參數(shù)時(shí)只有自己的ip能訪問(wèn)
port:是默認(rèn)端口號(hào),為80時(shí),網(wǎng)址后面不用加:你設(shè)置的端口號(hào),
debug:在代碼中修改return的值后debug的值為T(mén)rue時(shí),不用重新執(zhí)行程序,刷新網(wǎng)頁(yè)即可刷新內(nèi)容
拓展
from flask import Flask
app=Flask(__name__)
@app.route('/<orders_id>') #加個(gè)<> <>里寫(xiě)的內(nèi)容為參數(shù)
def a(orders_id):
return '%s'%orders_id
app.run()
在谷歌里輸入你的ip后加上/你要寫(xiě)的內(nèi)容 網(wǎng)頁(yè)展示內(nèi)容即為你要寫(xiě)的內(nèi)容
如果限制只能是數(shù)字的話(huà) <int:orders_id> <float:orders_id>
return
return 只能返回字符串 和render_template
如果要返回字典之類(lèi)的 要轉(zhuǎn)成json類(lèi)型
import json json.dumps()
from flask import Flask,jsonify
return {'a':'b'} #報(bào)錯(cuò)
return str({'a':'b'}) #純文本形式,沒(méi)有數(shù)據(jù)類(lèi)型,即沒(méi)有鍵值對(duì)
return json.dumps({'a':'v'}) #文本形式,但保留了鍵值對(duì)
return jsonify({'a':'v'}) #json類(lèi)型 有鍵值對(duì)
app.conifg['JSON_AS_ASCII']=False #將返回的漢字不以ASCII形式返回
app.config.from_pyfile('settings.ini') # 可以新建settings.ini 在這里寫(xiě)配置
重定向
from flask import Flask,redirect,url_for
app=Flask(__name__)
@app.route('/')
def a():
return 'a'
@app.route('/five')
def five():
return redirect(url_for('a')) #當(dāng)你輸入網(wǎng)址為你的ip+/+five 時(shí) 這個(gè)網(wǎng)頁(yè)展示內(nèi)容其實(shí)就跳轉(zhuǎn)到a()方法里返回的內(nèi)容
#重定向到黑馬官網(wǎng)
@app.route('/demo5')
def demo5():
return redirect('http://www.itheima.com')
#重定向到自己寫(xiě)的視圖函數(shù)
#可以直接填寫(xiě)自己url路徑
#也可以使用url_for生成指定視圖函數(shù)所對(duì)應(yīng)的url
@app.route('/demo1')
def demo1():
return 'demo1'
#重定向
@app.route('/demo5')
def demo5():
return redirect(url_for('demo1'))
#重定向到帶有參數(shù)的視圖函數(shù)
#在 url_for 函數(shù)中傳入?yún)?shù)
# 路由傳遞參數(shù)
@app.route('/user/<int:user_id>')
def user_info(user_id):
return 'hello %d' % user_id
# 重定向
@app.route('/demo5')
def demo5():
# 使用 url_for 生成指定視圖函數(shù)所對(duì)應(yīng)的 url
return redirect(url_for('user_info', user_id=100))
取網(wǎng)址參數(shù)
from flask import Flask,request,jsonify
app=Flask(__name__)
@app.route('/<id>')
def a(id):
return '%s'%id
#當(dāng)你輸入的網(wǎng)址為你的ip + / + 你要展現(xiàn)的內(nèi)容, 頁(yè)面內(nèi)容即為你要展現(xiàn)的內(nèi)容
@app.route('/')
def b():
name=request.args.get('name')
id=request.args.get('id')
return jsonify({'name':name,'id':id})
#當(dāng)你輸入的網(wǎng)址為你的ip + /? +name=小明&id=7 展現(xiàn)的內(nèi)容即為{'name':小明,'id':7}
content-type
json類(lèi)型: 'content-type':'application/json'
字符串類(lèi)型:'content-type':'text/plain'
解析類(lèi)型:'content-type':'text/html'
cookie\session
獲取cookie request.get.cookie('')
獲取session session.get('')
cookie:指某些網(wǎng)站為了辨別用戶(hù)身份、進(jìn)行會(huì)話(huà)跟蹤而儲(chǔ)存在用戶(hù)本地的數(shù)據(jù)(通常經(jīng)過(guò)加密)
復(fù)數(shù)形式Cookies
cookie是由服務(wù)器生成,發(fā)送給客戶(hù)端瀏覽器,瀏覽器會(huì)將Cookie的Key/value保存,下次請(qǐng)求同一網(wǎng)站時(shí)就發(fā)送該cookie給服務(wù)器(前提是瀏覽器設(shè)置為啟用cookie)
cookie的Key/value可以由服務(wù)器端自己定義
Cookie是存儲(chǔ)在瀏覽器中的一段純文本信息,建議不要存儲(chǔ)敏感信息如密碼,因?yàn)殡娔X上的瀏覽器可能被其它人使用
Cookie基于域名安全,不同域名的Cookie是不能互相訪問(wèn)的
如訪問(wèn)itcast.cn時(shí)向?yàn)g覽器中寫(xiě)了Cookie信息,使用同一瀏覽器訪問(wèn)baidu.com時(shí),無(wú)法訪問(wèn)到itcast.cn寫(xiě)的Cookie信息
瀏覽器的同源策略
當(dāng)瀏覽器請(qǐng)求某網(wǎng)站時(shí),會(huì)將本網(wǎng)站下所有Cookie信息提交給服務(wù)器,所以在request中可以讀取Cookie信息
#設(shè)置cookie
from flask import Flask,Response
@app.route('/cookie')
def set_cookie():
resp=Response("this is to set cookie")
resp.set_cookie('username','itcast')
return resp
設(shè)置過(guò)期時(shí)間
@app.route('/cookie')
def set_cookie():
response=Response('hello world')
response.set_cookie('username','itheima',3600) #單位是秒
return response
獲取cookie
from flask import Flask,request
#獲取cookie
@app.route('/request')
def resp_cookie():
resp=request.cookies.get('username')
return resp
Session
對(duì)于敏感重要的信息,建議儲(chǔ)存在服務(wù)器端,在服務(wù)器端進(jìn)行狀態(tài)保持的方案就是session
session依賴(lài)于cookie
session數(shù)據(jù)的獲取
session:請(qǐng)求上下文對(duì)象,用于處理http請(qǐng)求中的一些數(shù)據(jù)內(nèi)容
@app.route('/index1')
def index1():
session['username']='itcast'
return reddirect(url_for('index'))
@app.route('/')
def index():
return session.get('username')
記得設(shè)置secretz-key='itcast' 這個(gè)里面的值自己可以隨意設(shè)置
刪除session
session.pop('')
app.config['PERMANENT_SESSION_LIFETIME']=20 #設(shè)置session的時(shí)效
flask路由
指定路由地址
#指定訪問(wèn)路徑為demo1
@app.route('/demo')
def demo1():
return 'demo1'
給路由傳參
有時(shí)我們需要將同一類(lèi)URL映射到同一個(gè)視圖函數(shù)處理,比如:使用同一個(gè)視圖函數(shù)來(lái)顯示不同用戶(hù)的個(gè)人信息
#路由傳遞參數(shù)
@app.route('/user/<user_id>')
def user_info(user_id):
return 'hello %s'%user_id
輸入的網(wǎng)址后綴加的什么 在網(wǎng)頁(yè)展示的就是什么,下面那個(gè)函數(shù)括號(hào)里必須是上面的參數(shù)
路由傳遞的參數(shù)默認(rèn)當(dāng)作string處理,也可以指定參數(shù)的類(lèi)型
#路由傳遞參數(shù)
@app.route('user/<int:user_id>')
def user_info(user_id):
return 'hello %d'%user_id
這里指定int,尖括號(hào)中的內(nèi)容是動(dòng)態(tài)的。在此暫時(shí)可以理解為接受int類(lèi)型的值,實(shí)際上int代表使用IntergeConverter去處理url傳入的參數(shù)
指定請(qǐng)求方式
在Flask中。定義一個(gè)路由,默認(rèn)的請(qǐng)求方式為:
GET
OPTIONS(自帶)
HEAD (自帶)
如果像添加請(qǐng)求方式,
@app.route('/demo2',methods=['GET','POST'])
def demo2():
#直接從請(qǐng)求中取到請(qǐng)求方式并返回
return request.method
request屬性
request就是flask中代表當(dāng)前請(qǐng)求的request對(duì)象,期中一個(gè)請(qǐng)求上下文變量
(理解成全局變量,在視圖函數(shù)中直接使用可以取到當(dāng)前本次請(qǐng)求)
屬性 說(shuō)明 類(lèi)型
data 記錄請(qǐng)求的數(shù)據(jù),并轉(zhuǎn)換為字符串 *
form 記錄請(qǐng)求中的表單數(shù)據(jù) MultiDict
args 記錄請(qǐng)求中的查詢(xún)參數(shù) MultiDict
cookies 記錄請(qǐng)求中的cookie信息 Dict
headers 記錄請(qǐng)求中的報(bào)文頭 EnvironHeaders
method 記錄請(qǐng)求使用的HTTP方法 GET/POST
url 記錄請(qǐng)求的URL地址 string
files 記錄請(qǐng)求上傳的文件 *
Request.Form:獲取以POST方式提交的數(shù)據(jù)(接收Form提交來(lái)的數(shù)據(jù));
Request.QueryString:獲取地址欄參數(shù)(以GET方式提交的數(shù)據(jù))
Request:包含以上兩種方式(優(yōu)先獲取GET方式提交的數(shù)據(jù)),它會(huì)在QueryString、Form、ServerVariable中都搜尋一遍。
requests模塊發(fā)送請(qǐng)求有data、params兩種攜帶參數(shù)的方法。
params在get請(qǐng)求中使用,data在post請(qǐng)求中使用。params是往url后面添加參數(shù),data是指POST請(qǐng)求傳入的字典或?qū)ο?/p>
上下文
上下文:相當(dāng)于一個(gè)容器,保存了Flask程序運(yùn)行過(guò)程中的一些信息
Flask中有兩種上下文,請(qǐng)求上下文和應(yīng)用上下文
請(qǐng)求上下文(request context)
思考:在試圖函數(shù)中,如何取到當(dāng)前請(qǐng)求的相關(guān)數(shù)據(jù)?比如:請(qǐng)求地址,請(qǐng)求方式,cookie等等
在flask中,可以直接在視圖函數(shù)中使用request這個(gè)對(duì)象進(jìn)行獲取相關(guān)數(shù)據(jù),而request就是請(qǐng)求上下文的對(duì)象,保存了當(dāng)前本次請(qǐng)求的相關(guān)數(shù)據(jù),請(qǐng)求上下文對(duì)象有:request,session
request:
封裝了HTTP請(qǐng)求的內(nèi)容,針對(duì)的是http請(qǐng)求。舉例:user=request.args.get('user'),獲取的是get請(qǐng)求的參數(shù)
session:
用來(lái)記錄請(qǐng)求會(huì)話(huà)中的信息,針對(duì)的是用戶(hù)信息,舉例:session['name']=user.id,可以記錄用戶(hù)信息,還可以通過(guò)session.get['name']獲取用戶(hù)信息
應(yīng)用上下文對(duì)象有:current_app , g
current_app
應(yīng)用程序上下文用于存儲(chǔ)應(yīng)用程序中的變量,可以通過(guò)current_app.name打印當(dāng)前app的名稱(chēng),也可以在current_app中存儲(chǔ)一些變量,例如:
應(yīng)用的啟動(dòng)腳本是哪個(gè)文件,啟動(dòng)時(shí)指定了哪些參數(shù)
加載了哪些配置文件,導(dǎo)入了哪些配置
連了那個(gè)數(shù)據(jù)庫(kù)
有哪些public的工具類(lèi),常量
應(yīng)用跑在那個(gè)機(jī)器上,IP多少,內(nèi)存多大
current_app.name
current_app.text_value='value'
g變量
g作為flask程序全局的一個(gè)臨時(shí)變量,充當(dāng)著中間媒介的作用,我們可以通過(guò)它傳遞一些數(shù)據(jù),g保存的是當(dāng)前請(qǐng)求的全局變量,不同的請(qǐng)求會(huì)有不同的全局變量,通過(guò)不同的thread id區(qū)別
g.name='abc'
注意:不同的請(qǐng)求,會(huì)有不同的全局變量
兩者區(qū)別:
請(qǐng)求上下文:保存了客戶(hù)端和服務(wù)器交互的數(shù)據(jù)
應(yīng)用上下文:flask應(yīng)用程序運(yùn)行過(guò)程中,保存的一些配置信息,比如程序名、數(shù)據(jù)庫(kù)連接、應(yīng)用信息等
上下文中的對(duì)象只能在指定上下文使用,超出范圍不能使用, 請(qǐng)求上下文和應(yīng)用上下文原理實(shí)現(xiàn):http://shouce.jb51.net/flask0.10/appcontext.html
注冊(cè)路由
@app.route('/')
def hello():
#會(huì)返回status code
#content-type 在http headers里
#content-type=text/html #默認(rèn)值 當(dāng)成html格式來(lái)解析
#將返回的結(jié)果封裝成一個(gè)Response對(duì)象
headers={
# 'content-type':'text/plain', #當(dāng)成普通的字符串來(lái)解析
'content-type':'application/json' #返回json類(lèi)型
}
# response=make_response('<html></html>',200) #301是重定向
# response.headers=headers
# return response
# return '<html></html>'
return '<html></html>',200,headers
# app.add_url_rule('/hello',view_func=hello) #也可以這樣來(lái)注冊(cè)路由的
以上就是python編程Flask框架簡(jiǎn)單使用教程的詳細(xì)內(nèi)容,更多關(guān)于python教程Flask框架使用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
如何用python實(shí)現(xiàn)復(fù)制粘貼功能
這篇文章主要介紹了如何用python實(shí)現(xiàn)復(fù)制粘貼功能,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-03-03
python實(shí)現(xiàn)桌面托盤(pán)氣泡提示
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)桌面托盤(pán)氣泡提示,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
Python3之簡(jiǎn)單搭建自帶服務(wù)器的實(shí)例講解
今天小編就為大家分享一篇Python3之簡(jiǎn)單搭建自帶服務(wù)器的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
Python寫(xiě)一個(gè)基于MD5的文件監(jiān)聽(tīng)程序
這篇文章主要給大家介紹了關(guān)于利用Python如何寫(xiě)一個(gè)基于MD5的文件監(jiān)聽(tīng)程序的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
解決python nohup linux 后臺(tái)運(yùn)行輸出的問(wèn)題
今天小編就為大家分享一篇解決python nohup linux 后臺(tái)運(yùn)行輸出的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
Python編程中Python與GIL互斥鎖關(guān)系作用分析
GIL互斥鎖用來(lái)保護(hù)Python世界里的對(duì)象,防止同一時(shí)刻多個(gè)線程執(zhí)行Python字節(jié)碼,確保線程安全,但也導(dǎo)致Python線程無(wú)法利用多核CPU優(yōu)勢(shì),本文來(lái)探討Python將來(lái)是否有可能去除GIL2021-09-09

