3-Flask上下文
Flask項(xiàng)目中有二個(gè)上下文题山,一個(gè)是應(yīng)用文上下文(app)枫振,另外一個(gè)是請(qǐng)求上下文(request)澳化。請(qǐng)求上下文request和應(yīng)用文上下文current_app都是一個(gè)全局變量烁竭。所有請(qǐng)求都共享的召边。Flask有特殊的機(jī)制可以保證每次請(qǐng)求的數(shù)據(jù)是隔離的铺呵,及A請(qǐng)求所產(chǎn)生的數(shù)據(jù)不會(huì)影響到B請(qǐng)求。所有可以直接導(dǎo)入request對(duì)象隧熙,也不會(huì)被一些數(shù)據(jù)影響了片挂。并且不需要在每個(gè)函數(shù)中使用request的時(shí)候傳入request對(duì)象。這二個(gè)上下文具體的實(shí)現(xiàn)方式和原理可以沒(méi)有不要詳細(xì)了解贞盯。
request:請(qǐng)求上下文的對(duì)象音念。這個(gè)對(duì)象一般用來(lái)保存一些請(qǐng)求的變量。比如method 躏敢、args 闷愤、 form等。
session:請(qǐng)求上下文的對(duì)象件余。這個(gè)對(duì)象一般用來(lái)保存一些會(huì)話信息讥脐。
current_app:返回當(dāng)前的app。
g:應(yīng)用上下文的對(duì)象啼器。處理請(qǐng)求時(shí)用作臨時(shí)存儲(chǔ)的對(duì)象旬渠。
常用的鉤子函數(shù)
。before_first_request:處理第一次請(qǐng)求之前執(zhí)行端壳。
1 @app.before_first_request
2? ? ? ?def first_request():
3? ? ? ? ? ? ? print 'first time request'
坟漱。before_request:在每次請(qǐng)求之前執(zhí)行,通掣澹可以用這個(gè)裝飾器來(lái)給視圖函數(shù)增加一些變量芋齿。
1 @app.before_request
2? ? ? def before_request():
3? ? ? ? ? ?if not hasattr(g,'user'):
4? ? ? ? ? ? ? ? ? setattr(g,'user','xxxx')
。teardown_appcontext:不管是否有異常成翩,注冊(cè)的函數(shù)都會(huì)在每次請(qǐng)求之后執(zhí)行觅捆。
1 @app.teardown_appcontext
2 def teardown(response):
3? ? ? print("teardown 被執(zhí)行")
4? ? ? return respons
。context_processor:上下文處理器麻敌。返回的字典中的鍵可以在模板上下文中使用栅炒。
1 @app.context_processor
2 def context_processor():
3? ? ? ? return {'current_user':'xxx'}
。errorhandkler:errorhandler接收狀態(tài)碼,可以自定義返回這種狀態(tài)碼的響應(yīng)的處理方法赢赊。
1 @app.errorhandler(404)
2? ? ? ?def page_not_found(error):
3? ? ? ? ? ? return 'This page does not exist',404
4-Restful API規(guī)范
restful api 是用于在前端與后臺(tái)進(jìn)行通信的一套規(guī)范乙漓。使用這個(gè)規(guī)范可以讓前后端開(kāi)發(fā)變得更加輕松。以下將討論這套規(guī)范的一些設(shè)計(jì)細(xì)節(jié)
協(xié)議:采用http或https協(xié)議释移。
數(shù)據(jù)傳輸格式:數(shù)據(jù)之間傳輸?shù)母袷綉?yīng)該都使用json叭披,而不使用xml。
url鏈接:url鏈接中玩讳,不能有動(dòng)詞涩蜘,只能有名詞。并且對(duì)于一些名詞熏纯,如果出現(xiàn)復(fù)數(shù)同诫,那么應(yīng)該在后面加s。
HTTP請(qǐng)求的方法
GET:從服務(wù)器上獲取資源樟澜。
POST:在服務(wù)器上新創(chuàng)建一個(gè)資源误窖。
PUT:在服務(wù)器上更新資源。(客戶端提供所有改變后的數(shù)據(jù))
PATCH:在服務(wù)器上更新資源秩贰。(客戶端只提供需要改變的屬性)
DELETE:從服務(wù)器上刪除資源贩猎。
示例
1.GET/users/:獲取所有用戶
2.POST/users/:新建一個(gè)用戶
3.GET/user/id/:根據(jù)id獲取一個(gè)用戶
4.PUT/user/id/:更新某個(gè)id的用戶的信息(需要提供用戶所有信息)
5.PATCH/user/id/:更新某個(gè)id 的用戶信息(只需要提供需要改變的信息)
6.DELETE/user/id/:刪除一個(gè)用戶。
狀態(tài)碼
狀態(tài)碼? ? ? ? ? ? 原生描述? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 描述
200? ? ? ? ? ? ? ? ? OK? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 服務(wù)器成功響應(yīng)客戶端的請(qǐng)求萍膛。?
400? ? ? ? ? ? ? ? ? INVALID REQUEST? ? ? ? ? ? ? ? ?用戶發(fā)出的請(qǐng)求有錯(cuò)誤吭服,服務(wù)器沒(méi)有進(jìn)行? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 新建或修改數(shù)據(jù)的操作
401? ? ? ? ? ? ? ? ? Unauthorized? ? ? ? ? ? ? ? ? ? ? ? ? ? ?用戶沒(méi)有權(quán)限訪問(wèn)這個(gè)請(qǐng)求
403? ? ? ? ? ? ? ? ? Forbidden? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 因?yàn)槟承┰蚪乖L問(wèn)這個(gè)請(qǐng)求
404? ? ? ? ? ? ? ? ? ?NOT FOUND? ? ? ? ? ? ? ? ? ? ? ? ? ? ?用戶發(fā)送的請(qǐng)求的url不存在
406? ? ? ? ? ? ? ? ? ?NOT Acceptable? ? ? ? ? ? ? ? ? ? ? ?用戶請(qǐng)求不被服務(wù)器接收(如服務(wù)器期? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?望客戶端發(fā)送某個(gè)字段,但沒(méi)有發(fā)送)
500? ? ? ? ? ? ? ? ? ?Internal server error? ? ? ? ? ? ? ? ? 服務(wù)器內(nèi)部錯(cuò)誤蝗罗,比如出現(xiàn)了bug