Ошибка типа возникает при использовании `прервать (404)`

#python #testing #nose #turbogears2

#python #тестирование #нос #turbogears2

Вопрос:

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

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
    )
 

Комментарии:

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

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

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

4. @pylover. Хорошая точка зрения.tnx

Ответ №1:

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

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

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

Комментарии:

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

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