【发布时间】:2014-02-13 15:28:57
【问题描述】:
我正在从 HTTP GET 请求中获取一个值。我正在检查该值是否不等于无。如果是,则发送返回消息,否则正在进行进一步处理。
def api_servers():
installation_name = request.args.get('installation_name', '')
if installation_name == '':
data = {"description": "Installation Name is required"}
return HttpResponse(json.dumps(data), status=400, mimetype='application/json')
data = { "arms": arms_list }
return HttpResponse(json.dumps(data), status=200, mimetype='application/json')
现在,我想使用装饰器函数检查这个条件。这就是我正在尝试的。
def wrapper(func):
def inner(): # I dont know what to pass in the arguments. Installation_name?
# Maybe? But then how do I pass Installation_name
if installation_name == '':
data = {"description": "Installation Name is required"}
return HttpResponse(json.dumps(data), status=400, mimetype='application/json')
else:
return func()
return inner
如何通过装饰器实现这一点?
编辑
当我继续进行时,我发现我需要另一个装饰器来检查data 是否为None。它还检查installation_name 是否为空,然后我需要“回收”installation_name 和@ 987654328@。我又重写了你的代码。但值正在互换,即data 得到installation_name,反之亦然。你能看看吗?谢谢
def with_description(fn):
def inner(*args, **kwargs):
# Precheck
installation_name = 'inst1'
if installation_name == '':
return 1
# If precheck passes
return fn(installation_name, *args, **kwargs)
return inner
def with_description1(fn):
def inner(*args, **kwargs):
# Precheck
data = 'data1'
if data == '':
return 1
# If precheck passes
return fn(data, *args, **kwargs)
return inner
@with_description
@with_description1
def api_servers1(installation_name,data):
print installation_name,data
api_servers1()
【问题讨论】:
-
func会是什么?你能解释一下装饰器的流程吗? -
@aIKid -
func将是api_servers。所以,流程是这样的。我得到了installation_name。我需要创建装饰器,它将检查installation_name是否为'',然后返回调用包装函数的其他内容。