一腻菇、視圖-路由
路由對應(yīng)視圖函數(shù)衷咽,并且可以接受參數(shù)份招。
參數(shù)類型
??? 路勁參數(shù)
??? 位置參數(shù)
關(guān)鍵字參數(shù)
請求參數(shù)
???? get 參數(shù)在路勁中?之后
???? post 參數(shù)在請求體中
參數(shù)語法
???? converter:var_name (參數(shù)類型:參數(shù)名)
參數(shù)類型comverter
???? string 字符串 接收的時(shí)侯也是string,匹配到 / 的時(shí)候是匹配結(jié)束
???????? #帶參數(shù),默認(rèn)是string
???????? @blue.route('/getname/')
????????? def getname(username):
????????? print(type(username))
????????? return '你的名字是:%s' % username
????? path 路徑 接收的時(shí)侯也是string距帅,而 / 只會當(dāng)字符串中的一個(gè)字符處理
# 帶參數(shù)path
@blue.route('/getpath/')
def getpath(where):
return '你在哪?%s' %where
int 整數(shù)行 接收的時(shí)侯也是int括堤,匹配到 / 的數(shù)字
# 帶參數(shù) 整形
@blue.route('/getage/')
def getage(age):
return '我的年齡是: %d' % age
any 多個(gè)中意義一個(gè) 指的是any 中提供的任意一個(gè)碌秸,類似于SQL查詢中的 in
# 帶參數(shù)any[數(shù)據(jù)庫in] 多個(gè)選一個(gè)
@blue.route('/getoption/')
def getoption(op):
return '你的選擇的是:%s' % op
uuid 格式
import uuid
#獲取uuid
@blue.route('/getuuid/')
def get_uuid():
return str(uuid.uuid4())
# ?帶參數(shù)uuid
@blue.route('/getuuid/')
def getuuid(uu):
return '你的uu %s' %uu
float 格式
# 帶浮點(diǎn)型參數(shù)
@blue.reute('/getscore/')
def getscore(score):
return '你的成績 %f' % score
注意:默認(rèn)是string類型
路由參數(shù)名和視圖函數(shù)名必須一致 !悄窃!
請求方式
默認(rèn)支持GET,HEAD,OPTIONS
如果想支持某一請求方式讥电,需要自己手動指定
@blue.route('/requesttest/',mothods=['POST','GET','PUT'])
反向解析
語法
url_for()
url_for('藍(lán)圖名.函數(shù)名')
例如
#反向解析
@blue.route('/gethello/')
# url_for('藍(lán)圖名.函數(shù)名')
def gethello():
p=url_for('blueflask.index')
return p
反向解析即是獲取對應(yīng)的路勁
二、視圖 - Request 請求
服務(wù)器在接收到客戶端請求后广匙,會自動創(chuàng)建Request對象允趟,由Flask自動創(chuàng)建,Requestt對象不可修改鸦致。
request.method 請求方式
request.path 路由中的路徑
request.args get 請求參數(shù)的包裝潮剪,args是一個(gè)ImmutableMultiDict對象,類字典結(jié)構(gòu)對象 數(shù)據(jù)存儲也是key-value 外層是大列表分唾,列表中的元素是元組抗碰,元組中左邊是key,右邊是value
request.form
存儲結(jié)構(gòu)和args一致
默認(rèn)是接受post參數(shù)
hai可以接收PUT绽乔,PATCH參數(shù)
re'quest.url 完整請求地址
request.base_url 去掉GET參數(shù)的URL
request.remove_addr 請求客戶端地址
request.file 上傳文件
request.headers 請求頭
request.cookie 請求中的cookie
ImmutableMultiDict類型
ImmutableMultiDict類似字典的數(shù)據(jù)結(jié)構(gòu) 與字典的區(qū)別弧蝇,可以存在相同的鍵
args、form折砸、files都是ImmutableMultiDict的對象
ImmutableMultiDict數(shù)據(jù)獲取方式
dict['uname']
dict.get('uname') # 推薦(在沒有數(shù)據(jù)為空)
dict.getlist('uname') # 獲取指定key對應(yīng)的所有值
例如
@blue.route('/requesttest/',methods=['GET','POST'])
def requesttest():
#請求方式
print(request.method)
#請求路徑
print(request.path)
#請求參數(shù)(get)類似于字典
print(request.args)
# print(request.args['name'])
print(request.args.get('sex')) # 取值
#請求參數(shù)(post)# 類似于字典
print(request.form)
print(request.args.get('name'))
#客戶地址
print(request.remote_addr)
#請求頭
print(request.headers)
# cookie
print(request.cookies)
#文件上傳
print(request.files)
return '請求測試'
request看疗、session 是內(nèi)置對象(所有路由函數(shù)中都有)!
三睦授、視圖 - Response響應(yīng)
服務(wù)器返回給客戶端的數(shù)據(jù)
Response創(chuàng)建方式
直接返回字符串
render_template 渲染模板两芳,將模板轉(zhuǎn)換成字符串
make_response 創(chuàng)建一個(gè)相應(yīng),是一個(gè)真正的Response
Response()創(chuàng)建
redirect
重定向
??? 返回的也是Response
反向解析
url_for('藍(lán)圖名.函數(shù)名')
endpoint
app上直接使用函數(shù)名
blueprint 藍(lán)圖名.函數(shù)名
例如
返回字符串
直接寫去枷,將內(nèi)容傳遞過去
@blue.route('/response/')
def get_response():
return '帶你裝逼帶你飛怖辆,帶你走進(jìn)垃圾堆!',403
返回創(chuàng)建response對象
@blue.route('/testresponse/')
def testresponse():
#創(chuàng)建response對象
respon = make_response('睡覺的醒醒是复!')
print(respon)
print(type(respon))
return respon
返回重定向
@blue.route('/redirect/')
def make_redir():
# 反向解析
return redirect(url_for('first.make_resp'))
返回json數(shù)據(jù)
resp = make_response('{'name':'disen','age':18}',200)
resp.headers['Content-Type'] = 'application/json'
return resp
return jsonify({'name':'disen','phone':17788818818})
返回配置
返回內(nèi)容
直接寫,將內(nèi)容傳遞過去
@blue.route('/response/')
def get_response():
return '一神帶四眼竖螃,一個(gè)打九個(gè)淑廊,就這么六',403
返回狀態(tài)碼
字符串形式直接將狀態(tài)碼添加到return的第二個(gè)參數(shù)
如果make形式特咆,直接添加到meke的第二個(gè)參數(shù)上
# response 響應(yīng)
@blue.route('/makeresponse/')
def make_resp():
resp = make_response('
社會我胖哥季惩,人狠,話不多D甯瘛蜀备!
',300)returen resp
返回重定向
redirect 重定向 302
url_for 反向解析
@blue.route('/redirect/')
def make_redir():
# 固定
# return redirect('/makeresponse/')
#反向解析
return redirect(url_for('blue.make_resp'))
拋出異常,終止程序執(zhí)行
abort 狀態(tài)碼
@blue.route('/makeabort/')
def make_abort():
# 拋出異常(4xx,5xx)
abort(404)
return '發(fā)生了什么荒叶?'
捕獲異常
可以根據(jù)狀態(tài)或 Exception進(jìn)行捕獲
函數(shù)中要包含一個(gè)參數(shù),參數(shù)用來接收異常信息
#捕獲404異常
@blue.errorhandler(404)
def hanfler404(exception):
return '
這逼是404J涫些楣!,錘它宪睹。
'四愁茁、視圖 - 會話技術(shù)
會話技術(shù)都是來解決HTTP請求在網(wǎng)絡(luò)開發(fā)中短鏈接的問題,HTTP是無狀態(tài)的亭病。
Cookie
客戶端會話技術(shù)鹅很,瀏覽器的會話技術(shù)
數(shù)據(jù)全是存在客戶端中
Cookie是通過服務(wù)器創(chuàng)建的Responsse來創(chuàng)建的
cookie特性
支持過期時(shí)間
默認(rèn)會自動攜帶本網(wǎng)站的所有cookie
根據(jù)域名進(jìn)行cookie存儲
不能跨域
不能跨瀏覽器
設(shè)置cookie
response = redirect(url_for('blue.index'))
resp.set_cookie('username',username)
獲取cookie
username = request.cookie.get('username','游客')
刪除cookie
resp = redirect(url_for('blue.user_index'))
resp.delete_cookie()
備注:
# 模板轉(zhuǎn)為字符串
tempstr = render_template('about.html',username= uu)
respon = make_response(tempstr)
return respon
cookie交互流程
Session
服務(wù)端的會話技術(shù)
所有數(shù)據(jù)存儲在服務(wù)器中
默認(rèn)存儲在內(nèi)存中
Django默認(rèn)做了數(shù)據(jù)持久化(存在了數(shù)據(jù)庫中)
存儲結(jié)構(gòu)也是key-value形式,鍵值對(其實(shí)就是字典)
session 是離不開cookie的
設(shè)置session
session['username'] = username
獲取session
username= session.get('username','游客')
刪除session
#方式一:session是存在cookie中的
resp.delete_cookie('session')
# 方式二:直接刪除session中對應(yīng)數(shù)據(jù)
session.pop('username')
session 交互流程
注意:要使用session還需要密匙種子SECRET_KEY罪帖,在app初始化添加進(jìn)去既可以(app.config[SECRT_KEY] = '123WER1245erwrwe&*%W34@##*&@!)
Token
手動實(shí)現(xiàn)的session
如果在web開發(fā)中沒有cookie促煮,那么token也是不能使用的
脫離web前端,Token是可以使用的
傳輸給客戶端整袁,客戶端保存
在請求的時(shí)候菠齿,將token值再傳輸回來
五、session -- 持久化保存
flask 中這些插件中幾乎并沒有干擾到之前的任何邏輯坐昙,使用起來非常的方便绳匀,就類似于中間件。
flask中session默認(rèn)存儲在內(nèi)存中炸客;
django中做了持久化疾棵,存儲在數(shù)據(jù)庫(可以修改到redis中);
flask中沒有對默認(rèn)session進(jìn)行任何處理痹仙;
flask-session 可以實(shí)現(xiàn)session的數(shù)據(jù)持久化是尔;
redis(緩存在磁盤上的時(shí)候,管理磁盤文件使用lru, 最近最少使用);
flask-session 安裝
pip install flask-session
官方文檔:https://pythonhosted.org/Flask-Session/
官方文檔:http://flask.pocoo.org/snippets/category/sessions/
flask-session 的配置(初始化完成后蝶溶,使用和之前session使用)
初始化 flask-session (在__init__.py中)
from flask-session import Session
app.config['SECRET_KEY'] = '135Wwei@o*&^dfsfasd78#*' # 密匙
app.config['SESSION_TY[E'] = 'redis' # 配置數(shù)據(jù)庫
session = Session() # 實(shí)例化session對象
session.init_app(app) # session 對象初始化
# 簡化操作:session =Session(app)
redis連接問題(需要啟動)
redis-sever
redis查看值
#進(jìn)入redis
redis-cli
#查看所有
keys *
# 獲取對應(yīng)的值
get xxx(key)
#獲取時(shí)間(session 的生命周期嗜历,默認(rèn)為31)
ttl xxx(key)
# 刪除對應(yīng)的值
del xxx(key)
#刪除當(dāng)前所有的
flushdb
session其他設(shè)置(flask-session同樣適用)
PERMANENT_SESSION_LIFETIME 設(shè)置超時(shí)時(shí)間
app.config[PERMANENT_SESSION_LIFETIME] = 60
SESSION_COOKIE_NAME 設(shè)置會話cookie的名稱
app.config['SESSION_COOKIE_NAME'] = 'falsk'
如果沒有安裝redis-server時(shí)啟動啟動不了的宣渗。安裝操作:sudo apt insatll redis