閱讀提示
本文將詳細介紹Python中的輕量級框架———Flask
目錄
一、flask入門
WEB工作原理
- C/S 客戶端/服務器端
- B/S 瀏覽器/服務器端
倆大核心
-
werkzeug
實現路由、調試和web服務的網關接口
-
jinjia2
實現了模板
簡介:
flask 是一個python微型框架 只提供了一個強健的核心 其它功能都需要通過第三方擴展庫來實現
安裝
pip install flask
完整啓動的代碼
from flask import Flask
app = Flask(__name__)
# 路由 別人訪問你的地址 http://www.baidu.com/a/b
@app.route('/')
def index():
print('訪問到我了')
# 響應
return '訪問到我了'
# 判斷只能在主文件中文件flask項目
if __name__ == '__main__':
# 運行flask
app.run()
啓動地址
http://127.0.0.1:5000
run啓動參數
參數 | 說明 |
---|---|
debug | 是否開啓調試模式 默認爲false 開啓會自動加載代碼 和顯示錯誤信息 |
threaded | 是否開啓多線程 默認是不開啓的 |
port | 端口號 默認5000 |
host | 主機 默認127.0.0.1 |
完整的啓動
app.run(host=‘0.0.0.0’,port=‘5001’,debug=True,threaded=True)
正常本地調試使用的時候 只需要開啓debug就可以 如果發生端口衝突 則開啓port
app.run(debug=True)
二、視圖函數
(1) 無參路由(沒有參數的路由地址)
實例
@app.route('/')
def index():
# 響應
return '訪問到我了'
(2) 帶一個參數的路由
格式
/路由名稱/<參數名>/
實例
@app.route('/welcome/<name>/')
def welcome(name):
return 'welcome {}'.format(name)
訪問
http://127.0.0.1/5000/lucky/
(3) 帶多個參數的路由
@app.route('/info/<name>/<age>/')
@app.route('/info/<name>_<age>/')
def info(name,age):
return '我叫:{} 我今年:{}歲了'.format(name,age)
訪問:
http://127.0.0.1/5000/lucky/18/
http://127.0.0.1/5000/lucky_18/
(4) 限制路由參數的訪問類型
通過 path、string、int、float進行限制
實例
@app.route('/welcome/<arg>/')
@app.route('/welcome/<string:arg>/') 值的類型爲字符串 默認就是string
@app.route('/welcome/<int:arg>/') 值的類型必須爲整形
@app.route('/welcome/<float:arg>/') 值的類型必須爲浮點型
@app.route('/welcome/<path:arg>/') 值的類型因爲字符串 只是/分隔符 不再認爲是分隔符 而是值的一部分
def welcome(arg):
print(type(arg))
return 'welcome {}'.format(arg)
注意:
- 一個視圖函數 是可以有多個路由名稱
- 路由結尾的/建議加上 否則會多一次重定向 如果在定義的時候路由結尾沒有/ 那麼在訪問的 時候 路由就不能有 / 否則 404
- 參數值的類型默認都爲 字符串!!!
三、重定向 redirect
作用:
可以直接通過瀏覽器跳轉到另外一個地址(視圖函數直接的跳轉)
導入:
from flask import redirect,url_for
- redirect 通過給定參數路由地址 進行跳轉
- url_for 通過視圖函數名稱 反向構造出路由地址
redirect的使用
實例
# 使用redirect
@app.route('/redirect/')
def my_redirect():
# 去首頁 無參路由
return redirect('/')
# 帶一個參數的路由地址的重定向
return redirect('/arg/lucky/')
# 帶多個參數的路由地址的重定向
return redirect('/args/lucky/18/')
url_for的使用
實例
# 使用url_for 的視圖函數
@app.route('/url_for/')
def my_urlfor():
# 構造首頁路由
print(url_for('index')) # /
# 給url_for 一個帶參的視圖函數 但是沒給參數 會報錯werkzeug.routing.BuildError: Could not build url for endpoint 'arg'. Did you forget to specify values ['name']?
print(url_for('arg'))
# 帶一個參數 給參數
print(url_for('arg',name='lucky')) #/arg/lucky/
# 帶多個參數的視圖函數
# werkzeug.routing.BuildError: Could not build url for endpoint 'args'. Did you forget to specify values ['age', 'name']?
print(url_for('args'))
# 帶參數
print(url_for('args',name='lucky',age=18)) #/args/lucky/18/
return 'url_for'
redirect和url_for的組合使用
實例
# redirect 和 url_for的組合使用
@app.route('/ru/')
def ru():
# 去首頁
return redirect(url_for('index'))
# 去一個參數的路由地址
return redirect(url_for('arg',name='lucky'))
# 去多個參數的路由地址
return redirect(url_for('args',name='lucky',age=18))
四、abort(終止)
導入
from flask import abort
類似python中的raise
上方的代碼正常執行 下面的代碼不在執行
raise 拋出的錯誤名稱
abort拋出的http狀態碼
實例
from flask import abort
@app.route('/test_abort/')
def test_abort():
print('abort上方')
abort(500)
print('abort下方')
return '測試abort的視圖函數'
五、捕獲錯誤
實例
# 捕獲狀態所對應的錯誤
# 參數 err 是當前捕獲狀態碼的錯誤信息
@app.errorhandler(500)
def server_error(err):
print(err)
return '你報500的錯誤了!!!'
@app.errorhandler(404)
def page_not_founde(err):
print('404了!')
return '404'
六、請求 request
作用:
獲取請求報文中 傳遞的數據
概述:
瀏覽器發送到服務器的所有報文被flask接收以後 會創建出request請求對象 request被用於視圖函數中 用來獲取請求的數據
導入:
from flask import request
request常用屬性
- url 完整的請求 url
- base_url 去掉get傳參的url
- host_url 只有主機IP和端口號的url地址
- host 主機和端口
- path 路由地址
- method 請求的方法
- remote_addr 獲取客戶端請求的ip地址
- args 獲取get傳參的參數
- form 存儲form表單傳遞過來的數據
- files 獲取文件上傳
- headers 獲取請求頭信息
- cookies 獲取請求的cookie
- json 獲取請求過來的json數據
實例
# 請求對象 request的使用
# http://127.0.0.1:5000/request/?name=lucky&age=18#name
@app.route('/request/')
def r():
print(request.url)
print(request.base_url)
print(request.host_url)
print(request.host)
print(request.path)
print(request.method)
print(request.remote_addr)
print(request.args['name'])
print(request.args['age'])
print(request.args.get('name'))
print(request.args.get('age'))
print(request.headers.get('User-Agent'))
return 'request請求對象'
七、響應 response
(1) 直接響應字符串數據
實例
@app.route('/')
def index():
# 只相應內容
return 'index'
# 響應內容和狀態碼
return 'index',404
(2) 通過make_response來構造響應
from flask import make_response
實例
@app.route('/')
def index():
# 手動構造響應
res = make_response('響應內容')
# 響應內容和狀態碼
res = make_response('響應內容',404)
return res
八、current_app
導入
from flask import current_app
概述
current_app 是當前app對象的一個代理對象 用於獲取實際的app對象和app上的配置信息
實例
# current_app的使用
@app.route('/test_current_app/')
def test_current_app():
print(current_app.config['SECRET_KEY'])
return 'test_current_app'
九、會話控制 cookie 的使用
概述
會話控制 用來保持用戶的狀態
原因:
http協議 是無狀態協議 每一次連接都是一個新的會話
cookie值的存儲
cookie存儲在客戶端的瀏覽器一般會限制存儲cookie的個數爲 20個 並且單個cookie保存值的大小不能超過4kb
存儲在瀏覽器上爲明文存儲 所有不安全
(1) 設置cookie
response.set_cookie(key,value,max_age=None,expires=None,path=’/’)
實例
# 設置cookie
@app.route('/set_cookie/')
def set_cookie():
res = make_response('設置cookie')
res.set_cookie('name','lucky')
return res
默認存活時間爲瀏覽會話結束
意思就是關閉瀏覽器時 就結束(切記 不是關閉標籤頁)
(2) 獲取cookie
實例
# 獲取cookie
@app.route('/get_cookie/')
def get_cookie():
val = request.cookies.get('name','值不存在') #若有值 則顯示,若沒有 則顯示值不存在
return val
(3) 刪除cookie
實例
# 刪除 cookie
@app.route('/delete_cookie/')
def delete_cookie():
res = make_response('刪除cookie')
res.delete_cookie('name')
return res
(4) 設置cookie並設置過期時間
實例
# 設置cookie並設置過期時間
@app.route('/set_cookie_expires/')
def set_cookie_expires():
res = make_response('設置cookie並設置過期時間')
# 設置cookie存活時間爲 1分鐘
# res.set_cookie('name','lucky',max_age=60)
left_time = time.time()+60
res.set_cookie('name','lucky',expires=left_time)
return res
十、會話控制session的使用
服務器需要識別同一個訪問者的請求 主要是通過瀏覽器中的cookie實現的 訪問者在第一次訪問服務器的時候 會在瀏覽器的cookie中 存儲一個唯一sessionid值 通過這個唯一id值區分不同的訪問者的請求
session基於cookie
注意:
設置session 需要添加 secret_key 祕鑰 進行sessionid加密生成的字符串
設置secret_key的方法
app.secret_key = 'lucky'
app.config['SECRET_KEY'] = 'lucky'
導入
from flask import session
(1) 設置session
# 設置session
@app.route('/set_session/')
def set_session():
session['name'] = 'lucky'
return '設置session'
(2) 獲取session
# 獲取session
@app.route('/get_session/')
def get_session():
val = session.get('name','沒有值')
return 'session的值爲:{}'.format(val)
(3) 刪除session
# 刪除session
@app.route('/delete_session/')
def delete_session():
# 刪除某個key的session值
# session.pop('name')
# 清除所有session
session.clear()
return 'session的key爲name的值被刪除'
(4) 設置session並設置過期時間
# 設置session並設置過期時間
@app.route('/set_session_leftime/')
def set_session_leftime():
# 開啓session持久化存儲
session.permanent = True
# timedelta是一個計算時間差值的模塊
app.permanent_session_lifetime = timedelta(minutes=1)
session['name'] = 'lucky'
return '設置session並設置過期時間'
區別:
- cookie數據存儲在瀏覽器上 session存儲在服務器上
- cookie 沒有session安全
- session會在一定時間內保存在服務器上 當訪問增多 會加大服務器的壓力 考慮性能優化 存儲在cookie上
- 個人建議 將登陸等重要的數據 存儲在sessino上 其它的建議存儲在cookie上
十一、flask擴展庫 flask-script
概述:
flask終端運行解析器
安裝:
pip install flask-script
使用
from flask import Flask
from flask_script import Manager
app = Flask(__name__)
manager = Manager(app)
...
if __name__ == '__main__':
manager.run()
啓動項參數:
獲取啓動項參數:
python 文件名.py runserver -?
完整啓動
python manager.py runserver -h0.0.0.0 -p5001 -d -r
正常啓動
python manage.py runserver -d -r
十二、藍本 blueprint
概述
當我們代碼越來越複雜的時候 很明顯將所有視圖函數 放在一個文件中 是不合理的 要按照功能進行視圖函數的劃分
使用 user.py
# user.py 就是所有處理用戶的視圖函數的py文件
# 導入藍本文件
from flask import Blueprint
user = Blueprint('user',__name__)
@user.route('/login/')
def login():
return '登錄'
@user.route('/logout/')
def logout():
return '退出登錄'
manager.py
from flask import Flask
from flask_script import Manager
app = Flask(__name__)
manager = Manager(app)
@app.route('/')
def index():
return 'index'
# 從user藍本文件 導入user藍本對象
from user import user
# 註冊藍本
# app.register_blueprint(user)
app.register_blueprint(user,url_prefix='/user')
if __name__ == '__main__':
manager.run()
訪問
http://127.0.0.1:5000/login/
http://127.0.0.1:5000/user/login/
注意
藍本之間的重定向 需要告訴url_for 是哪個藍本文件的視圖函數名 否則報錯
@app.route('/')
def index():
# index視圖 去 user.py藍本
# return redirect('/user/login/')
# 配合 url_for 需要注意 告訴人家 是哪個藍本文件的視圖函數
return redirect(url_for('user.login'))
擴展
web框架
其他語言
M model 模型 操作數據庫
V view 視圖 負責展示模板給用戶看的
C controller 控制器 進行邏輯功能與模型和視圖的交互
python中
M model 模型 操作數據庫
V view 視圖 進行邏輯功能與模型和視圖的交互
T templates 模板 負責展示模板給用戶看的