下面咱們從Templates、Views和Models這三個部分來了解下Flask框架html
Templates這部分主要講解如下幾個部分:前端
語法:
{{變量|過濾器}}
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 %}
子模板中的內容會覆蓋父模板中的內容
複製代碼
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這部分主要講解如下幾個部分:mysql
一:基本路由的配置:
#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請求沒法接收,可是能夠手動設置請求的接收方式。web
下面的函數既能接收get請求又能接收post請求
@app.route('/xxx',methods=['POST','GET'])
def xxx():
pass
複製代碼
正向解析:程序自動解析,根據@app.route()中的訪問路徑,來匹配處理函數
反向解析:經過視圖處理函數的名稱自動生成對應的訪問路徑
在Flask中要實現反向解析:
url_for(funName,args)
funName:要生成地址的函數名
args:該地址中須要的參數
複製代碼
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 : 獲取完整的請求地址,從協議開始
複製代碼
響應有下面的三種方法:
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文件:sql
<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"
複製代碼
增:
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
複製代碼
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這部分主要講解如下幾個部分:flask
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)
複製代碼
下面連接有詳細的講解這一部分: 模型類的關係映射api
#接收前端傳遞過來的數據
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.sessin.query().過濾器函數().執行函數()
複製代碼
語法:
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對象中的查詢結果的數量
複製代碼