python - 使用 `abort(404)` 时引发 TypeError

标签 python testing nose turbogears2

当我使用 abort(status_code=404, detail='No such user', passthrough='json') 引发此异常:

TypeError: 'NoneType' 对象不可迭代 这是回溯:

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
    )

最佳答案

这是身份验证层所做的事情,每当向用户发出需要身份验证的信号时,挑战者就会进行干预并强制用户登录 (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') 否则你将面临你提到的崩溃。

关于python - 使用 `abort(404)` 时引发 TypeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40077971/

相关文章:

python - 如何在( Nose )测试执行期间显示 Python 警告?

python - 合并按列中的值分组的 2d numpy 数组

javascript - 帮助使用 Selenium 进行测试

python - Pandas assert_frame_equal 行为

unit-testing - 如何自动检测 Web 应用程序中的错误?

python - 现在为什么不在测试中使用 python 的 assert 语句呢?

python - 将字典(数组)导出到 json

python - 如何检查排序列表中是否存在序列?

python - 使用 Selenium Python 将数据收集为元组

python - 让 Nose 无法通过慢速测试