使用裝python飾器做緩存
裝飾器在之前的文章中有講過,這里主要是說了裝飾器的用法和應(yīng)該怎么理解。這片文章給出一片補(bǔ)充:主要說在緩存方面的應(yīng)用。
在此之前呢,需要補(bǔ)充一些知識(shí)點(diǎn):就是 python 查找變量的順序是什么?
答案就是LEGB原則:也就是`Local -> Enclosed -> Global -> Built-in`
也就是先在局部作用域內(nèi)(例如函數(shù)內(nèi))進(jìn)行查找,然后在[閉包]
1
內(nèi)查找,接下來分別是全局作用域和內(nèi)置的保留名稱
注意:閉包內(nèi)的變量,不能改變,但是對(duì)于列表類型或是字典類型的話,可以進(jìn)行修改內(nèi)部的值。這也是用裝飾器作為緩存的關(guān)鍵地方!
代碼如下:主要是cache函數(shù), 可以運(yùn)行起來,然后訪問本機(jī)8089端口,多次刷新,就會(huì)發(fā)現(xiàn)變化了!(注意鏈接后面要加參數(shù)x=1)
有什么問題可以在評(píng)論區(qū)討論呦,多多交流!
# coding=utf8
import
tornado
from
tornado
.
web
import
RequestHandler
from
tornado
.
ioloop
import
IOLoop
from
functools
import
wraps
def
cache
(
func
)
:
x
=
[
0
]
@wraps
(
func
)
def
wrapper
(
*
args
,
**
kwargs
)
:
# print args, kwargs
self
=
args
[
0
]
# x.append(args[0])
x
[
0
]
+=
int
(
self
.
get_argument
(
"x"
)
)
print
x
return
func
(
*
args
,
**
kwargs
)
return
wrapper
class
MainHandler
(
RequestHandler
)
:
@cache
def
get
(
self
,
*
args
,
**
kwargs
)
:
# print "yes"
# print self.get_argument("x")
self
.
write
(
"yes!"
)
def
post
(
self
,
*
args
,
**
kwargs
)
:
self
.
write
(
"hello!"
)
def
make_app
(
)
:
return
tornado
.
web
.
Application
(
handlers
=
[
(
r
"/"
,
MainHandler
)
]
)
if
__name__
==
'__main__'
:
app
=
make_app
(
)
app
.
listen
(
8089
)
IOLoop
.
current
(
)
.
start
(
)
-
閉包:就是函數(shù)內(nèi)的函數(shù)引用內(nèi)部函數(shù)外的變量,這個(gè)函數(shù)就是個(gè)閉包. ??
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
