2014-01-23 2 views
1

Я получаю значение из запроса 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 

Как я могу достичь этого через декоратор?

EDIT Пока я исходил, я обнаружил, что мне нужен еще один декоратор, который проверяет data является None или not.It также проверяет installation_name пуст или нет, а затем мне нужно «рецикл» как installation_name и data , Я снова написал ваш код. Но значения меняются, т. Е. 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() 
+0

Что было бы «func' be? Не могли бы вы объяснить, как будет выглядеть поток с декораторами? – aIKid

+0

Возможный дубликат [У вас возникли проблемы с изготовлением декоративного декоратора django (с помощью 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

Эмм, дать этому попытку:

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 

С этим вы выигрываете, что каждая функция оформлены фактически вызывается только тогда, когда проходит ПРЕДВАРИТЕЛЬНАЯ ПРОВЕРКА.

EDIT

Если в качестве комментариев, вы хотите, чтобы переработать название установки, вы просто должны передать его в вызов функции. Возможна одна из следующих возможностей:

fn(installation_name, *args, **kwargs) 

И, конечно же, украшенная функция должна ожидать этого аргумента.

+0

Хорошо работает. Так как я также требую 'installation_name' позже в этой функции, есть ли способ получить значение' install_name' в функции 'api_servers' из созданного декоратора? Потому что я не хочу снова добавить значение «имя_подстановки» в функцию, следовательно, сохранение из повторяющегося кода. –

+0

Конечно, прочитайте мое обновление. – bgusach

+0

В то время как я продолжал, я обнаружил, что мне нужен еще один декоратор, который проверяет 'data' на' None' или нет. Он также проверяет, является ли 'installation_name' пустым или нет, а затем мне нужно« переработать »как« имя_становщика », 'data'. Я снова написал ваш код. Но значения меняются. Можете ли вы, пожалуйста, посмотреть? Я отредактировал свой вопрос, с какими проблемами сталкиваюсь. спасибо –

Смежные вопросы