2016-10-17 7 views
1

Когда я использую abort(status_code=404, detail='No such user', passthrough='json') Это исключение сгенерировано:TypeError возникает при использовании `прерывания (404)`

TypeError: 'NoneType' object is not iterable Это отслеживающий:

File "/home/jugger/.virtualenvs/ave/lib/python3.5/site-packages/tg/appwrappers/identity.py", line 47, in __call__ 
    return self.next_handler(controller, environ, context) 
File "/home/jugger/.virtualenvs/ave/lib/python3.5/site-packages/tg/appwrappers/i18n.py", line 71, in __call__ 
    return self.next_handler(controller, environ, context) 
File "/home/jugger/.virtualenvs/ave/lib/python3.5/site-packages/tg/wsgiapp.py", line 285, in _dispatch 
    return controller(environ, context) 
File "/home/jugger/workspace/web/ave/ave/lib/base.py", line 27, in __call__ 
    return TGController.__call__(self, environ, context) 
File "/home/jugger/.virtualenvs/ave/lib/python3.5/site-packages/tg/controllers/dispatcher.py", line 119, in __call__ 
    response = self._perform_call(context) 
File "/home/jugger/.virtualenvs/ave/lib/python3.5/site-packages/tg/controllers/dispatcher.py", line 108, in _perform_call 
    r = self._call(action, params, remainder=remainder, context=context) 
File "/home/jugger/.virtualenvs/ave/lib/python3.5/site-packages/tg/controllers/decoratedcontroller.py", line 125, in _call 
    response = self._render_response(context, controller, output) 
File "/home/jugger/.virtualenvs/ave/lib/python3.5/site-packages/tg/controllers/decoratedcontroller.py", line 220, in _render_response 
    for name in exclude_names: 
TypeError: 'NoneType' object is not iterable 
--------------------- >> end captured logging << --------------------- 

Это мой код: Стараюсь чтобы получить учетную запись, которой не существует, так что NoResultFound пойман и в результате должен быть сделан abort. но это вызывает исключение, о котором я упоминал выше.

@expose('json') 
def get_one(self, account_id): 
    """ 
    Get an account 

    :param account_id :type: str 

    :return Account :type: dict 
    """ 
    try: 
     _id = int(account_id) 
    except ValueError: 
     abort(status_code=400, detail='account_id must be int', passthrough='json') 
    try: 
     account = DBSession.query(Account).filter(Account.id == _id).one() 
    except NoResultFound: 
     abort(status_code=404, detail='No such user', passthrough='json') 
    return dict(
     id=account.id, 
     username=account.username, 
     reputation=account.reputation, 
     badges=account.badges, 
     created=account.created, 
     bio=account.bio 
    ) 
+0

Это нормально прикрепить изображения только при необходимости. Предоставление ошибок и вход в строку справки - загрузка страниц и поисковые системы. – pylover

+0

@pylover Вы правы, но это превысит лимит количества слов. У меня не было других вариантов. – Juggernaut

+0

Вам не нужно публиковать весь стек вызовов. это помогает другим пользователям искать ваш почтовый ящик google. – pylover

ответ

3

Это то, что слой аутентификации делает, всякий раз, когда сигнал обратно пользователю, что аутентификация необходима претенденту будет вмешиваться и заставить пользователя войти в систему (http://turbogears.readthedocs.io/en/latest/turbogears/authentication.html?highlight=challenger#how-it-works-in-turbogears)

Если вы хотите, чтобы избежать этого поведение Самый простой способ - использовать tg.abort(401, passthrough=True), который пропустит такой шаг, поскольку вы говорите об API, который, вероятно, захотите использовать passthrough='json', который предоставит ответ JSON. См http://turbogears.readthedocs.io/en/latest/reference/classes.html#tg.controllers.util.abort

Ваш ответ может затем попасть в ErrorPageApplicationWrapper в зависимости от версии TurboGears в таком случае убедитесь, что ErrorController.document@expose('json') имеет или вы будете сталкиваться аварии вы упомянули.

+0

Спасибо. Это решило мою проблему, но есть еще одна проблема. Я отредактирую вопрос и упомянул об этом. – Juggernaut

+2

Это странно, где вы называете 'abort'? можете ли вы предоставить фрагмент, который воспроизводит проблему? Прерывание, как предполагается, полностью пропускает механизм рендеринга, поэтому я не вижу, как вы могли бы сделать рендеринг шаблона. – amol

+0

Я отредактировал вопрос @amol – Juggernaut