flask
每天的內容
- flask跑起來
- 模板引擎
- flask表單
- 檔案上傳郵件傳送
- flask-sqlalchemy
一、web框架的簡介
M 模型 負責資料的操作
V 檢視 負責資料的展示
C 控制器 控制你的M的操作以及檢視模板的渲染
在python中叫做MVT
M 模型 負責資料的操作
V 控制你的M的操作以及檢視模板的渲染 業務邏輯的操作
T templates 模板 負責資料的展示
二、架構
BS browser-》server
CS client-》server
三、FLASK
概念: flask是一個非常小的web框架 被稱為微型框架 只提供了一個強健的核心 其它的都是通過第三方擴充套件庫來實現
組成:
- 除錯 路由 WSGI
- 模板引擎 jinja2 (就是由flask核心人員開發的模板引擎)
使用:
安裝 pip install flask
例項
from flask import Flask
app = Flask(__name__) #例項化flask
#路由地址 根據使用者不同的url進行處理
@app.route(`/`)
def index():#處理當前請求的函式
return `Hello Flask`
if __name__ == `__main__`:
app.run() #執行當前的flask
四、檢視函式
(1) 無參路由
#路由地址和檢視函式名稱 是否同名沒有關係
#http://127.0.0.1:5000/test/
@app.route(`/test/`) #路由地址末尾的/建議加上
def test():
return `我是測試使用的檢視函式`
(2) 帶一個引數的路由
http://127.0.0.1:5000/page/10/
@app.route(`/page/<pagenum>/`) #引數的語法格式 /路由名稱/<形參名>/
def page(pagenum):
return `當前的頁碼為{}`.format(pagenum)
(3) 帶多個引數
#帶多個引數
# http://127.0.0.1:5000/arg/10/zhansgan/
@app.route(`/arg/<age>/<name>/`)
def getarg(age,name):
return `我叫{} 我見年{}歲了`.format(name,age)
# http://127.0.0.1:5000/arg/zhansgan_10/
@app.route(`/arg/<name>_<age>/`)
def getarg(age,name):
return `我叫{} 我見年{}歲了`.format(name,age)
(4) 限制引數的型別
#引數型別
# @app.route(`/argtype/<arg>/`)
# @app.route(`/argtype/<int:arg>/`) #限定引數型別為int
# @app.route(`/argtype/<float:arg>/`) #限定引數型別為float
# @app.route(`/argtype/<string:arg>/`) #限定引數型別為string 預設就是字串
@app.route(`/argtype/<path:arg>/`) #其實path就是string 但是path會將路由地址後面的所有的路由或者值都認為是一個值 /不在作為分隔符來使用
def argtype(arg):
print(type(arg))
print(arg)
return `獲取引數型別的檢視函式`
注意
- 路由地址末尾的/建議加上 因為如果輸入的時候沒有加預設的/瀏覽器會自動幫你加上
- 形參名字寫在路由的<> 中間
- 引數預設型別都為string
五、檢視函式的響應
(1) return 字串進行響應
@app.route(`/response/`)
def res():
return `我是響應`,404 #響應一個指定標準的狀態碼
(2) 通過make_response構造響應
匯入:
from flask import make_response
@app.route(`/make_response/`)
def makeResponse():
res = make_response(`我是響應的內容`)
# res = make_response(`我是響應的內容`,404)
return res
六、重定向 redirect
作用: 從一個地址跳向另外一個地址
匯入
from flask import redirect
例項
@app.route(`/`)
def index():#處理當前請求的函式
return `Hello Flask`
#重定向
@app.route(`/redirect/`)
def redirect_index():
return redirect(`/`) #引數為路由地址
return redirect(`/argtype/redirect_index/`) #帶引數路由地址的重定向
url_for 通過檢視函式名稱 反向構造出路由地址
匯入
from flask import redirect,url_for
例項
@app.route(`/redirect/`)
def redirect_index():
url = url_for(`test`)
url = url_for(`getarg`,name=`zhangsan`,age=18) #帶多個引數
#@app.route(`/arg/<name>_<age>/`)
#def getarg(age,name):
return url #/test/
注意:
如果給定的檢視函式名稱不存在 則丟擲異常
url_for 和 redirect 組合使用
@app.route(`/redirect/`)
def redirect_index():
return redirect(url_for(`test`))
return redirect(url_for(`getarg`,name=`zhangsan`,age=18)) #帶多個引數
七、abort 終止
概念:
在檢視函式中處理的時候 可以使用abort丟擲指定狀態碼的錯誤 下面程式碼不在執行
需要丟擲標準http的狀態碼
from flask import abort
例項
@app.route(`/abort/`)
def my_abort():
# abort(404)
# abort(500)
return `丟擲狀態碼`
#捕獲500的錯誤
@app.errorhandler(500)
def server_error(e):
return `現在能看到了嗎{}`.format(e)
#捕獲404的錯誤資訊
@app.errorhandler(404)
def server_error(e):
return `您訪問的頁面被外星人劫持走了!!!`
八、app.run() 引數說明
引數 | 引數說明 | 預設值 |
---|---|---|
host | 主機名 | 127.0.0.1 |
port | 埠號 | 5000 |
debug | 除錯 | False |
threaded | 多執行緒 | False |
例項
if __name__ == `__main__`:
# app.run(debug=True) #開啟除錯模式
app.run(host=`0.0.0.0`,port=5001,debug=True,threaded=True)
十、請求 request
說明:
request是由flask框架為我們提供好的物件 使用時 只要匯入即可
使用者在請求的時候 框架會為當前請求的使用者 建立一個request(請求的物件) 包含當前使用者請求的所有資訊
匯入
from flask import request
- url 使用者請求的完整的url
- base_url 去除get傳參後的url
- host_url 只有主機和埠號的url
- path 獲取請求的路由地址
- method 請求的方法
- args 獲取get傳參
- form 獲取表單傳遞過來的資料
- files 獲取檔案上傳過來的資料
- headers 獲取使用者請求過來的頭資訊
- cookies 獲取使用者請求過來的所有cookie
- json 獲取使用者請求過來的json資料
例項
@app.route(`/request/`)
def get_request():
print(`使用者請求的完整的url`,request.url)
print(`去除get傳參後的url`,request.base_url)
print(`只有主機和埠號的url`,request.host_url)
print(`獲取請求的路由地址`,request.path)
print(` 請求的方法`,request.method)
print(`獲取拼湊的get傳參`,request.args)
print(`獲取拼湊的get傳參`,request.args.get(`name`))
print(`獲取拼湊的get傳參`,request.args.get(`age`))
print(`獲取表單傳遞過來的資料`,request.form)
print(`獲取檔案上傳過來的資料`,request.files)
print(`獲取使用者請求過來的頭資訊`,request.headers)
print(`獲取使用者請求過來的所有cookie`,request.cookies)
print(`獲取使用者請求過來的json資料`,request.json)
return `request物件`
十一、會話控制 cookie和session
cookie
設定cookie
response.set_cookie(
key, #設定鍵
value,#設定值
max_age=None, #過期時間
path = `/` #當前cookie的儲存路徑
)
獲取cookie
@app.route(`/get_cookie/`)
def get_cookie():
print(request.cookies)
return request.cookies.get(`name`,`default預設值`)
刪除cookie
#清除cookie
@app.route(`/del_cookie/`)
def del_cookie():
res = make_response(`清除cookie`)
res.delete_cookie(`name`)
return res
cookie儲存值為明文儲存 安全性低
cookie存在客戶端(瀏覽器中)
cookie預設存活時間為 當前瀏覽結束(關閉當前的瀏覽器)
session
session的使用 需要一個secret_key 來進行加密產生加密的字串
app.config[`SECRET_KEY`] = `secretkey`
會給cookie設定一個唯一的識別符號 sessionId 伺服器端會通過cookie攜帶著唯一的sessionId來區分是哪一個使用者的請求 如果客戶端的cookie被禁用了 那麼伺服器端的session將無法使用 session基於cookie
設定session
#設定session
@app.route(`/set_session/`)
def set_session():
預設存活當前瀏覽器結束
session[`username`] = `張三`
return `設定session`
設定session 及過期時間
#設定session
@app.route(`/set_session/`)
def set_session():
session.permanent = True #設定session持久化儲存
#設定當前session的存活時間60秒 如果當前設定失敗 那麼存活時間為1月
app.permanent_session_lifetime = timedelta(seconds=60)
session[`username`] = `張三`
return `設定session`
獲取session
#獲取session
@app.route(`/get_session/`)
def get_session():
return session.get(`username`,`default預設值`)
刪除session
@app.route(`/del_session/`)
def del_session():
#刪除 key為username的session
session.pop(`username`)
#刪除所有session
# session.clear()
return `刪除session`
十二、flask-script擴充套件
簡介:
就是一個flask終端執行的解析器 通過不同引數 來設定flask的啟動項
安裝
sudo pip3 install flask-script
使用
from flask_script import Manager #匯入終端執行的解析器
app = Flask(__name__)
manager = Manager(app)
...
if __name__ == `__main__`:
manager.run()
啟動引數
-h | 主機 |
---|---|
-p | 埠號 |
-d | 除錯 |
-r | 重新載入 |
-threaded | 多執行緒 |
python manage.py runserver -h
python manage.py runserver -h0.0.0.0 -p5000 -d -r –threaded
python manage.py runserver -d -r
十三、藍本藍圖 Blueprint
概述
當所有程式碼越愛越多的時候 在manage.py中 很明顯是不合理的 我們需要將不同功能的檢視函式 存放在不同的檔案中 使用我們的專案的目錄結構更加的清晰
使用
user.py 使用者的處理
from flask import Blueprint
user = Blueprint(`user`,__name__)
@user.route(`/login/`)
def login():
return `登入`
manage.py中
from mysession import mysession
from user import user
#http://127.0.0.1:5000/login/
app.register_blueprint(user) #註冊藍本
#http://127.0.0.1:5000/user/login/
app.register_blueprint(user,url_prefix=`/user`) #註冊藍本並新增字首
藍本中的重定向
@app.route(`/`)
def index():
# return `首頁`
return redirect(`/user/login/`)
return redirect(url_for(`user.login`)) #使用url_for反向構造出路由的時候 需要指定當前的檢視函式 是哪一個藍本物件的
十四、請求鉤子函式
在manage檔案中使用
鉤子函式 | 功能描述 |
---|---|
before_first_request | 第一次請求之前 |
before_request | 每次請求之前 |
after_request | 每次請求之後 沒有異常 |
teardown_request | 每次請求之後 即使有異常出現 |
例項
@app.before_first_request
def before_first_request():
print(`before_first_request`)
@app.before_request
def before_request():
print(`before_request`)
if request.method == `GET` and request.path == `/form/`:
abort(500)
@app.after_request
def before_request(r):
print(`before_request`,r)
return r
@app.teardown_request
def teardown_request(r):
print(`teardown_request`)
return r
在藍本中使用
鉤子函式 | 功能描述 |
---|---|
before_app_first_request | 第一次請求之前 |
before_app_request | 每次請求之前 |
after_app_request | 每次請求之後 沒有異常 |
teardown_app_request | 每次請求之後 即使有異常出現 |
例項
@user.before_app_first_request
def before_first_request():
print(`before_first_request`)
@user.before_app_request
def before_request():
print(`before_request`)
if request.method == `GET` and request.path == `/form/`:
abort(500)
@user.after_app_request
def after_request(r):
print(`after_request`,r)
return r
@user.teardown_app_request
def teardown_request(r):
print(`teardown_request`)
return r
注意:
鉤子函式寫在藍本或者啟動檔案中 都可以捕獲到所有的請求和響應(一樣)一個flask中只需要寫一個鉤子函式而不需要重複寫鉤子函式