#Flask 安裝依賴包及作用
- jinja2 模板語言 (flask依賴包)
- markupsafe 防止css攻擊 (flask依賴包)
- werkzeug --wkz 類似於django中的wsgi,承載服務 (flask依賴包)
1.1Flask啟動
# 三行啟動
from flask import Flask
app = Flask(__name__)
app.run("0.0.0.0",9527) #監聽地址,監聽端口
1.2 Response
- return "字符串" -->httpresponse
- return render_template('html文件',變量='字符串') -->默認存儲位置是remplates,返回模板,依賴markupsafe包
- return redirect("/login") -->重定向 在響應頭中加入-location:url地址,然后跳轉
- 特殊的Response
- return send_file("文件名稱或者文件路徑+文件名稱") -->打開文件,返回文件你內容,自動識別文件類型,在響應頭中加入content-Type:文件類型
- return jsonify({k:v}) -->返回標准格式的json字符串,在響應投中加入content-Type:appcation/json
- 在Flask 1.1.1版本中,直接返回dict時,本質上是在運行jsonify
- 在Flask1.1.1中,可以直接返回字典,flask默認先把字典序列化之后再返回,在content-type中加入application/json
1.3 FLask Request
- request.from 獲取FormData中的數據(類似Djnago中的request.POST)
- to_dict() 轉化為類似字典類型,可以通過get和[key]取值,[key],當key不存在時,出現KeyError錯誤
- request.args 獲取url中的數據(類似Djnago中的request.GET)
- to_dict() 轉化為類似字典類型,可以通過get和[key]取值,[key],**當key不存在時,出現KeyError錯誤
- request.files 獲取Fome中上傳文件:
- request.json
- 如果請求中存在 Content-Type:application/json ,那么請求體中的數據 被序列化到 request.json 中,並且以 以字典的形式存放
- request.data
- 如果請求中 存在Content-Type 中不包含 Form 或 FormData ,保留請求體中的原始數據,是base類型 b" ".存放
- request.method #請求方法
- request.host #主機位: 127.0.0.1:5000
- request.url #完整的url,包括參數
- request.path #請求路徑,路由地址
- request.cookies #字典獲取瀏覽器請求時帶上的cookie
- request.files # request文件,返回filestorage,.save保存文件
- request.heads 獲取請求頭
1.4 Flask session
-
交由客戶端保管機制,客戶端保存的是一串加密字符串,保存在服務器的內存中
-
設置session
1.在Flask中設置密鑰 app.secret_key = "@#^%&*&@^&%^#*@" 或者: app.config['SECRET_KEY'] = "@#^%&*&@^&%^#*@" 2.設置session session["user"]="123" 3.獲取session session.get('user') # 交由客戶端保管機制 1.登陸成功后設置session,Flask根據密鑰和要設置的session鍵值對經過位運算,生成session,保存到內存中,需要的話就通過get獲取,不需要關閉時刪除,並在瀏覽器中設置鍵值對--session:string 2.在發出請求時,根據瀏覽器中的--session:string和Flask中secret_key,反序列化就得到了session鍵值對
1.5 Flask 路由
from flask import Flask
app = Flask(__name__)
@app.route('/',methods=("POST","GET"),endpoint='別名',defaults={"count":20} )
def home(count):
count = request.args.get('count',count) #指定頁數就優先,如果沒有取默認值
app.run()
-
rule= '/' 第一個時url,
-
methods= ["GET","POST",..] 支持的請求方式(get查詢,post增加,put更新,delete刪除,options跨域)
-
endpoint 別名 * 同一個項目中別名不能重復,默認值是視圖函數名,
Mapping,別名. 反向解析 url = url_for('別名') -
strict_slashes = True 嚴格遵守路由匹配
-
defaluts 默認參數
-
redirect_to ='/' 永久重定向,不管url是什么都會跳轉到'/'
- 應用場景: 地址更換時,點擊原來地址跳轉到新地址
#添加路由時不一定用裝飾器,可以使用 app.add_url_rule(rule, # 路由地址 view_func #視圖函數 )
1.6 動態參數路由
- 可以分頁,獲取文件,解決分類,解決正則路由問題
from flask import Flask
app = Flask(__name__)
@app.route('/home/<page>') #page默認類型是字符串接收
def home(page): # 需要傳參接收
pass
@app.route('/home/<page>_<id>_<id2>') #默認類型是字符串接收
def home(page,id,id2): # 需要傳參接收
pass
app.run()
1.7 Flask初始化配置##重要!!!
from flask import Flask
app = Flask(
__name__,
template_folder = 'templates', # 更改母版存放路徑,默認值是templates ##重要!!!
static_folder = 'static', # 指定靜態文件保存目錄,默認值是static "家" ##重要!!!
static_url_path = "/static", # 靜態文件訪問路徑,默認值是 /+static_folder "回家的路" ##重要!!!
)
#原理
@app.route('/<filename>', )
def func(filename):
filepath = os.path.join('img', filename) # img就是家
return send_file(filepath) # filepath就是訪問路徑
if __name__ == '__main__':
app.run()
1.8 Flask實例配置
- 基本配置
from flask import Flask
app = Flask(
__name__,
template_folder = 'templates', # 更改母版存放路徑,默認值是templates ##重要!!!
static_folder = 'static', # 指定靜態文件保存目錄,默認值是static "家" ##重要!!!
static_url_path = "/static", # 靜態文件訪問路徑,默認值是 /+static_folder "回家的路" ##重要!!!
)
# 實例化配置
app.debug = True # 修改代碼自動重啟
app.secret_key = '$%^^$' #設置session值需要改密匙
app.session_cookie_name = 'session' # 設置的session名稱 ,默認是session
app.permanent_session_lifetime= # session生命周期,以秒計時,默認31天
# 另外一種更改配置方式
app.config['DEBUG']= True # 這種方式速度更快
#app.config Flask配置
#app.defalut_config flask默認配置
if __name__ == '__main__':
app.run()
- settings文件配置(重要!!!),快速切換工作模式
# settinigs.py文件代碼
class DebugConfig(object):
"""線上開發環境"""
DEBUG = True
SECRET_KEY = "#$%^&*($#$%^&*%$#$%^&*^%$#$%"
PERMANENT_SESSION_LIFETIME = 3600
SESSION_COOKIE_NAME = "I am Not Session"
class TestConfig(object):
"""測試環境"""
TESTING = True
SECRET_KEY = hashlib.md5(f"{time.time()}#$%^&*($#$%^&*%$#$%^&*^%$#$%{time.time()}".encode("utf8")).hexdigest()
PERMANENT_SESSION_LIFETIME = 360000
SESSION_COOKIE_NAME = "#$%^&*($#$%^&*%$#$%^&*^%$#$%" # session名字
#配置生效
1.導入配置文件
from settings import DebugConfig,TestConfig
2.環境生效
app.config.from_object(DebugConfig) # 線上環境
app.config.from_object(TestConfig) # test環境,需要的時候只需要啟用DebugConfig,TestConfig其中一條
1.9 Flask藍圖 Blueprint
- Blueprint,類似普通的Flask實例,不能被run的Flask實例,不存在config
-
創建藍圖bp_users.py文件,名字可以更改
from flask import Blueprint bp = Blueprint('bp01', __name__,url_prefix='url前綴') # 'bp01'第一個參數是唯一標識,整個環境不能重復! url_prefix='url前綴',當存在多個藍圖url沖突時,在地址欄輸入'url前綴',就可以訪問指定的藍圖文件 @bp.route('/user',endpoint='user') def user(): return '我是藍圖函數01' -
建立關系
# 在項目的app.run文件中 from app01 import bp #導入藍圖 app.register_blueprint(bp) # 注冊藍圖 -
訪問指定路徑
-
在藍圖中反向解析時,需要注意書寫格式:
url = url_for('藍圖標識.裝飾器別名')
-
1.10特殊裝飾器
類似於django中的中間件
- @app.before_request
- 在請求進入視圖函數之前,順序執行,做出處理
- 類似dganjo中的request中間件
- 執行規律django中的request中間件一樣
- @app.after_request
- 在視圖函數之后執行,倒序執行,做出處理
- 類似django中的response中間件
- 與django中間件不同的是:after_request不管什么情況,只要有響應都會倒序全部執行
- @app.errorhandler(錯誤碼)
- 錯誤監聽裝飾器
- 錯誤碼只能是4(請求錯誤)或5(服務器錯誤)開頭的
- 可以重定義錯誤界面
@app.before_request
def is_login():
"""
校驗登錄狀態
:return:
"""
path = request.path
if path != '/login':
if not session.get('is_login'):
return redirect('/login')
return None
@app.errorhandler(404)
def error(error_msg): # 形參必須添加
"""
校驗登錄狀態
:return:
"""
return '沒找到頁面'
1.11CBV
-
基本格式
from flask import view,Flask app = Flask(__name__) class Login(views.MethodView): #繼承MethodView,使類變成視圖函數 def get(self,*args,**kwargs): pass def post(self,*args,**kwargs): pass app.add.url_rule('/login', endpoint='login', # 如果endpoint不定義的話名稱就是view_func的name,必須唯一 view_func=Login.as_view(name='loginlogin'), # name就是就是view_func的名稱 ) app.run()
2.第三方組件Flask-Session
-
setdefault() 字典的方法
dict.setdefault(key, default=None) #參數 key -- 查找的鍵值。 default -- 鍵不存在時,設置的默認鍵值。 #返回值 如果 key 在 字典中,返回對應的值。如果不在字典中,則插入 key 及設置的默認值 default,並返回 default ,default 默認值為 None。 -
安裝Flask-session包
- app.session_interface 就是默認的session接口,Flask利用session_interface選擇session的存放位置和存放機制.
from flask import Flask, request, session from flask_session import Session #導入Session from redis import Redis # 導入redis app = Flask(__name__) app.secret_key = '$%^&*%$' # flask_session使用pickle轉化,密鑰可以不使用 app.config['SESSION_TYPE'] = 'redis' # 設置session存放機制,,瀏覽器中存的就是session_id,session存在redis中 app.config['SESSION_REDIS'] = Redis(host='192.168.12.10', port=6379, db=10) Session(app) # 使普通sesson變成flask_session # app.session_interface #Flask利用app.session_interface 選擇session存放位置和存放機制 @app.route('/set') def sets(): session['key'] = 'QWER' return 'set' @app.route('/get') def gets(): return session.get('key') app.run()
