什麼是Flask Flask是一個基於Python而且依賴於Jinja2模板引擎和Werkzeug WSGI服務的一個微型框架 Flask中包含一個輕量級的web 服務器主要用於在開發階段測試使用 Falsk使用MTV框架模式 MTV框架模式 M : Models , 模型層 , 主要負責根據數據庫建模 T : Templates , 模板層 ,處理用戶的顯示的內容的,如:html V : Views ,視圖 , 處理與用戶交互的內容(請求和響應) 下面咱們從Templates、Views和Models這三個部分來了解下Flask框架 Templates Templates這部分主要講解如下幾個部分: 過濾器 標籤(for循環遍歷可迭代對象) 宏 繼承 自定義404/500等錯誤頁面 過濾器 語法: {{變量|過濾器}} Jinja2模板中經常使用的過濾器有: capitalize 首字符變大寫,其餘字符變小寫 lower 將值轉換爲小寫字符 upper 將值轉換爲大寫字符 title 將值中的每一個單詞的首字符變大寫 trim 去掉值兩端的空格 複製代碼 標籤 {% for 變量 in 列表|元組|字典 %} {% endfor %} for標籤中的內置對象loop loop.index 獲取下標 loop.index0 從0開始的下標 loop.first True/False loop.last True/False 複製代碼 宏 下面是一個關於Flask中宏的用法的實例: <!-- 聲明宏:接收一個字符串做爲參數,將參數放p中打印輸出 --> {% macro showP(str) %} <h3>使用宏顯示的內容:</h3> <p>{{str}}</p> {% endmacro %} <!-- 使用宏 --> <div> {% for name in params.list %} {{showP(name)}} {% endfor %} </div> <!-- 引入外部的宏 --> {% import 'macros.html' as ms %} {% for name in params.list %} {{ms.show_p(name)}} {% endfor %} 複製代碼 繼承 父模板中: {% block title %} 父模板中的內容 {% endblock %} 子模板中: {% extends '父模板.html' %} {% block title %} 子模板中的內容 {% endblock %} 子模板中的內容會覆蓋父模板中的內容 複製代碼 自定義404/500等錯誤頁面 1.404 的錯誤處理 @app.errorhandler(404) def page_not_fount(e): return render_template('404.html'),404 2.500 的錯誤處理 @app.errorhandler(500) def internal_server_error(500): return render_template('500.html'),500 404.html 和 500.html 須要自定義 複製代碼 Views Views這部分主要講解如下幾個部分: 路由 請求方法 url反向解析 request對象 響應response 文件上傳 cookies session 路由 一:基本路由的配置: #http://127.0.0.1:5000/ @app.route('/') def index(): return "xxx" 二:帶參數路由的配置: 1.基本帶參數的路由 @app.route('/show/<name>') def show1(name): name:表示的就是地址欄上傳遞的數據 pass 2.指定參數類型的路由 @app.route('/show/<name>/<int:age>') def show(name,age): name : 字符串 age : 整數 可選的參數類型爲 int float path(字符串,能夠有斜槓/) 三:多個路由的配置: @app.route('/地址1') @app.route('/地址2') .... def index(): pass 複製代碼 請求方法 在Flask中默認只能接收get請求,post請求沒法接收,可是能夠手動設置請求的接收方式。 下面的函數既能接收get請求又能接收post請求 @app.route('/xxx',methods=['POST','GET']) def xxx(): pass 複製代碼 url反向解析 正向解析:程序自動解析,根據@app.route()中的訪問路徑,來匹配處理函數 反向解析:經過視圖處理函數的名稱自動生成對應的訪問路徑 在Flask中要實現反向解析: url_for(funName,args) funName:要生成地址的函數名 args:該地址中須要的參數 複製代碼 request對象 request中的經常使用成員 1.scheme:獲取請求方案(協議) 2.method:獲取請求方式(重點,取值爲 post 或 get) 3.args : 獲取使用get請求方式提交過來的數據(重點) 4.form : 獲取使用post請求方式提交過來的數據(重點) 5.cookies : 獲取cookies中的相關信息 6.headers : 獲取請求消息頭的相關信息 7.files : 獲取上傳的文件 8.path : 獲取請求的資源的具體路徑(不帶參數) 9.full_path : 獲取完整的請求資源的具體路徑(帶參數) 10.url : 獲取完整的請求地址,從協議開始 複製代碼 響應response 響應有下面的三種方法: 1.返回響應模板(可帶上參數) @app.route('/') from flask import render_template def index1(): return render_template('xxx.html', params=locals()) 2.構建響應對象,並返回 from flask import make_response @app.route('/') def index2(): resp = make_response('響應內容') resp = make_response(render_template('xxx.html')) return resp 3.重定向 from flask import redirect @app.route('/') def index3(): return redirect('/login') 複製代碼 文件上傳 html文件: <form action="/01-file" method="post" enctype="multipart/form-data"> <p> 用戶姓名: <input type="text" name="uname"> </p> <p> 用戶圖像: <input type="file" name="uimg"> </p> <p> <input type="submit" value="提交"> </p> </form> 複製代碼 後臺代碼: @app.route('/01-file',methods=['GET','POST']) def file_views(): if request.method == 'GET': return render_template('01-file.html') else: #處理的上傳的文件 #1.獲得上傳的文件 f = request.files['uimg'] #2.將文件保存進指定的目錄處[相對路徑] # print('文件名稱:'+f.filename) # f.save('static/'+f.filename) #3.將文件保存進指定的目錄處[絕對路徑] #獲取當前文件的所在目錄名 basedir = os.path.dirname(__file__) #print('當前文件所在目錄的絕對路徑:'+basedir) #獲取當前的時間拼成字符串,再拼上擴展名 ftime=datetime.datetime.now().strftime("%Y%m%d%H%M%S%f") #獲取文件的擴展名 (b04.jpg) ext = f.filename.split('.')[1] filename = ftime + "." + ext upload_path = os.path.join(basedir,'static/upload',filename) # print('完整的上傳路徑:'+upload_path) f.save(upload_path) return "Save OK" 複製代碼 cookies 增: resp=make_response('保存cookie成功') resp.set_cookie('uname','test',3600) 刪: 響應對象.delete_cookie('key') 查詢: uname = request.cookies.get('key') request.cookies['key'] request.cookies # 拿到全部的cookies if 'key' in request.cookies: pass 複製代碼 session from flask import session 配置 SECRET_KEY: app.config['SECRET_KEY']="thisisarandomstring" 增: session['key'] = value 刪: del session['key'] 查: value = session['key'] value = session.get('key') 複製代碼 Models Models這部分主要講解如下幾個部分: 數據庫鏈接和基本配置 模型類的關係映射 插入數據 查詢數據 數據庫鏈接和基本配置 from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # 爲app指定數據庫的配置信息 app.config['SQLALCHEMY_DATABASE_URI']='mysql://root:123456@localhost:3306/flask' #指定當視圖執行完畢後,自動提交數據庫操做 app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN']=True # 建立 SQLAlchemy的數據庫實例 db = SQLAlchemy(app) 複製代碼 模型類的關係映射 下面連接有詳細的講解這一部分: 模型類的關係映射 插入數據 #接收前端傳遞過來的數據 uname = request.form.get('uname') uage = request.form.get('uage') uemail = request.form.get('uemail') #將數據構建成實體對象 user = Users(uname,uage,uemail) #將數據保存回數據庫 db.session.add(user) # db.session.commit() 複製代碼 查詢數據 基於db.session進行查詢 基於 基於db.session進行查詢 語法 db.sessin.query().過濾器函數().執行函數() 複製代碼 基於 Models 類進行查詢 語法: Models.query.查詢過濾器函數().查詢執行函數() 複製代碼 過濾器函數 過濾器函數 做用:專門對數據進行篩選,返回部分行數據 1.filter() 按指定條件進行過濾(單表,多表,定值,不定值) 2.filter_by() 按等值條件進行過濾 3.limit() 按限制行數量獲取結果 4.order_by() 按指定列進行排序 5.group_by() 按指定條件進行分組 過濾器函數詳解: 過濾器函數詳解: 1.filter() 注意:條件必須由 實體類.屬性 組成 1.查詢年齡大於 30 的人的信息 db.session.query(Users).filter(Users.age>30).all() 2.查詢id爲1的人的信息 db.session.query(Users).filter(Users.id==1).first() 注意:filter()作等值判斷時必須使用 == 3.查詢年齡大於30而且id大於1的用戶的信息 filter(條件1,條件2,...) : and db.session.query(Users).filter(Users.age>30,Users.id>1).all() 4.查詢年齡大於30或者id爲1的用戶的信息 查詢或者操做,須要使用or_() filter(or_(條件1,條件2)) from sqlalchemy import or_ db.session.query(Users).filter(or_(Users.age>30,Users.id==1)).all() 5.查詢 email 中包含 'w' Users的信息 db.session.query(Users).filter(Users.email.like('%w%')) 6.查詢 id 在 [2,4] 列表中的Users的信息 db.session.query(Users).filter(Users.id.in_([2,4])).all() 2.filter_by() 注意:只能作等值判斷,不能作不等值 查詢id爲1的users的信息 db.session.query(Users).filter_by(id=1).first() 3.limit() 1.獲取 users 表中的前2條數據 db.session.query(Users).limit(2).all() select * from users limit 2 2.獲取 users 表中過濾前3條數據後剩餘的前2條數據 select * from users limit 3,2 db.session.query(Users).limit(2).offset(3).all() 4.order_by() # 按照 id 倒序排序 select * from users order by id desc; # 先按照年齡倒序排序,再按照id升序排序 select * from users order by age desc,id asc; db.session.query(Users).order_by("age desc,id asc").all() 5.group_by() 1.將 users 表中的數據按照 age 進行分組 db.session.query(Users.age).group_by('age').all() 6.聚合函數 1.查詢users表中全部人的平均年齡 select avg(age) from users; from sqlalchemy import func db.session.query(func.avg(Users.age).label('avgAge')).all() 2.users表中,按年齡分組,再查每組的年齡平均值 select age,avg(age) from users group by age db.session.query(func.avg(Users.age)).group_by('age').all() 聚合函數: 1.func.avg() : 求平均值 2.func.sum() : 求和 3.func.max() : 求最大值 4.func.min() : 求最小值 5.func.count() : 求不爲空的數量 複製代碼 執行函數 查詢執行函數 目的:在query()的基礎上獲得最終的數據 語法:db.session.query(Models).查詢執行函數() 1.all():以列表的方式返回query對象中全部的查詢數據 2.first():返回query對象中的第一個查詢結果, 若是沒有結果,返回None 3.first_or_404():返回query對象中的第一個查詢結果, 若是沒有結果的話則終止程序並響應404 4.count():返回query對象中的查詢結果的數量