【发布时间】:2010-09-25 09:04:01
【问题描述】:
举个例子:
def get_booking(f=None):
print "Calling get_booking Decorator"
def wrapper(request, **kwargs):
booking = _get_booking_from_session(request)
if booking == None:
# we don't have a booking in our session.
return HttpRedirect('/')
else:
return f(request=request, booking=booking, **kwargs)
return wrapper
@get_booking
def do_stuff(request, booking):
# do stuff here
我遇到的问题是,@get_booking decorator 甚至在我调用我正在装饰的函数之前就被调用了。
开始时输出:
Calling get_booking Decorator
Calling get_booking Decorator
Calling get_booking Decorator
Calling get_booking Decorator
Calling get_booking Decorator
Calling get_booking Decorator
Calling get_booking Decorator
Calling get_booking Decorator
Calling get_booking Decorator
Calling get_booking Decorator
[26/Oct/2008 19:54:04] "GET /onlinebooking/?id=1,2 HTTP/1.1" 302 0
[26/Oct/2008 19:54:05] "GET /onlinebooking/ HTTP/1.1" 200 2300
[26/Oct/2008 19:54:05] "GET /site-media/css/style.css HTTP/1.1" 200 800
[26/Oct/2008 19:54:05] "GET /site-media/css/jquery-ui-themeroller.css HTTP/1.1" 200 25492
此时我什至还没有调用装饰过的函数。
我刚刚开始使用装饰器,所以也许我遗漏了一些东西。
【问题讨论】:
-
直接回答问题标题,装饰器是否在被装饰函数之前运行?。不,声明函数时它不会运行。它在函数被调用时运行。我希望这会有所帮助。