2011-12-23 4 views
0

я декоратор назвал «Auth»Python Bottle.py декоратор путаница

def auth(check_func=validate_login): 
    def decorator(view): 
     def wrapper(*args, **kwargs): 
      auth = check_func() 
      if auth: 
       return view(*args, **kwargs) 
      return bottle.redirect('/login.html') 
     return wrapper 
    return decorator 

auth декоратор используется как этот

@get('/') 
@view("someview") 
@auth() 
def handler(): 
    #myhandlercode 

так auth декоратор вызывает функцию view, которая делает мой шаблон в бутылке. Но теперь я хочу вернуть json вместо рендеринга view. Итак, какие изменения я должен внести в код декоратора auth, чтобы это произошло? Я путаюсь, как вызвать обработчик вместо view из кода auth.

РЕДАКТИРОВАТЬ 1: Бутылка позволяет вам вернуть dict, она напрямую преобразует ее в json. И я не хочу использовать представление вообще, я просто хочу вернуть json пользователю из моих обработчиков. Так что я должен просто удалить декоратор @view? и что я должен назвать вместо этого в декораторе?

ответ

2

Декораторы для бутылочных трасс могут применять декораторы к вам, не разрушая функцию авто json.

@get('/', apply=[auth]) 
def handler(): 
    ... 

Если вы не хотите, вида, просто удалить вашу @view декоратора, бутылки ручки dicts изящно, превращая его в JSON ответ.

0

Вы возвращаете Json (или, скорее, словарь python) с вашего вида, не так ли? В этом случае вам не нужно ничего менять в декораторе. То, что возвращается, не сразу пересылается в браузер пользователя, оно сначала обрабатывается бутылкой, а затем возвращается пользователю. Когда вы возвращаете словарь из представления, его обрабатывают как Json, при возврате строки шаблона он обрабатывается как Html.

1

Я не верю, что это право иметь автошайбину в json dumping.

Вот пример с простой ол питона с использованием декораторов

def validate(): 
    return True 

def auth(valid=validate): 
    def _auth(f): 
     def _auth_wrap(): 
      if not valid(): 
       raise Exception('redirect') 
      return f() 
     return _auth_wrap 
    return _auth 

def view(tmpl): 
    def _view(f): 
     def _view_wrap(): 
      return tmpl.format(f()) 
     return _view_wrap 
    return _view 

@view('Hello, {0}') 
@auth() 
def handler(): 
    return 'World' 

handler 
# outputs: __main__._view_wrap 
handler() 
# outputs: 'Hello, World' 

, а также линии

return tmpl.format(f()) 

f FUNC является __main__._auth_wrap, который призывает проверить и возвращая выполняется обработчик.

Итак, вы должны обработать демпинг json, выполнив что-то еще, кроме tmpl.format в вышеперечисленном виде, например, вызов отдельного метода и передачу необходимой информации, или shoehorning в view decorator, который в любом случае будет более уместным.

Так что, чтобы ответить на конечный вопрос немного лучше, если вы хотите динамически решить, следует ли сбрасывать json на основе запроса, а функция fun.py для флайса не поддерживает это, вы можете сделать оболочку представления аналогичной к вышесказанному, который выполняет проверки объекта запроса или что-то, что вы хотите использовать для определения вывода json, а затем либо вызывать просмотр бутылки.py или json.dumps на f() в _view_wrap

Если вы хотите, чтобы func всегда dump json, затем удалите декоратор и создайте декоратор json, похожий на декоратор изображения выше, который будет return json.dumps(f())

Главное здесь держать auth, делая то, что подразумевает это имя.

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