2014-01-23 4 views
1

HTTP GET 요청에서 값을 가져옵니다. 값이 none이 아닌지 확인하고 있습니다. 그럴 경우 반환 메시지가 보내지고 그 밖의 처리가 진행됩니다.장식 자 생성

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 

어떻게하면 데코레이터로이 작업을 수행 할 수 있습니까? 내가 진행하는 동안

편집 , 나는 I가 "재활용"dataNone 또는 not.It도 installation_name이 비어 있거나 여부를 확인하고 내가 필요로 확인 다른 장식이 필요하다는 것을 발견 모두 installation_namedata . 다시 코드를 작성했습니다. 그러나 값은 상호 교환됩니다. 즉 datainstallation_name이되고 그 반대의 경우도 마찬가지입니다. 좀 봐 주시겠습니까? 이와

import functools 

def with_description(fn): 

    @functools.wraps(fn) # This is not strictly necessary, just pulls info (docstrings, etc) from fn and pushes into the wrapper 
    def wrapper(*args, **kwargs): 
     # Precheck 
     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') 

     # If precheck passes, call the actual function 
     fn(*args, **kwargs) 

    return wrapper 

당신이 PreCheck를 통과하는 경우에만 실제로 장식 모든 기능이 불려 가도록 승리 : 감사

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() 
+0

'func'은 무엇입니까? 데코레이터와 같이 흐름이 어떠해야하는지 설명해 주시겠습니까? – aIKid

+0

[(args와 함께) 사용자 정의 장고 뷰 데코레이터를 만드는 데 문제가 있음] (http://stackoverflow.com/questions/19965036/having-trouble-making-a-custom-django-view-decorator-with-args)) –

+0

@aIKid -'func'는'api_servers'입니다. 그래서, 흐름은 이와 같습니다. 나는'installation_name'을 얻는다. 나는'installation_name'이''''인지 확인한 데코레이터를 생성 할 필요가 있습니다. 그리고 다른 어떤 것을 반환하면 래핑 된 함수를 호출합니다. –

답변

3

음이 시도를 제공합니다. 등의 댓글을 달았 경우

편집

, 당신은 단지 함수 호출에 전달해야, 설치 이름을 재활용합니다. 하나의 가능성은 다음과 같습니다 :

fn(installation_name, *args, **kwargs) 

물론 장식 된 함수는 그 인수를 기대해야합니다.

+0

잘 작동합니다. 나중에 함수에서'installation_name'을 필요로하기 때문에 생성 된 데코레이터에서'api_servers' 함수의'installation_name' 값을 얻을 수있는 방법이 있습니까? 왜냐하면 필자는 함수에서'installation_name' 값을 다시 얻고 싶지 않기 때문에 반복적 인 코드로부터 절약 할 수 있습니다. –

+0

물론 내 업데이트를 읽어보십시오. – bgusach

+0

내가 진행하는 동안'데이터 '가'None'인지 아닌지를 확인하는 또 다른 데코레이터가 필요하다는 것을 알았습니다. 또한'installation_name'이 비어 있는지 확인한 다음'installation_name'과 '데이터 '. 다시 코드를 작성했습니다. 그러나 그 가치는 상호 교환되고 있습니다. 좀 봐 주시겠습니까? 내가 겪고있는 문제로 내 질문을 편집했습니다. 덕분에 –