django:将 BadRequest 提升为异常?

新手上路,请多包涵

是否可以将 BadRequest 作为 django 中的异常?

我看到您可以提出 404 [1]。

用例:在辅助方法中,我从 request.GET 加载一个 json。如果由于浏览器 (IE) 切断了 url 而切断了 json,我想提出一个匹配的异常。

一个 BadRequest 异常看起来很合适,但到目前为止 django 中似乎没有这样的异常。

在 1.6 中有一个 SuspiciousOperation 异常。但这在我的情况下不匹配,因为它与安全无关。

当然,我可以在视图方法中围绕我的辅助方法尝试 try..except,但这不是 DRY。

有人有一个解决方案,我不需要 try..exception 每次调用我的辅助方法吗?

[1] https://docs.djangoproject.com/en/1.6/ref/exceptions/#django.core.urlresolvers.Resolver404

更新

代码示例:

 def my_view(request):
    data=load_data_from_request(request) # I don't want a try..except here: DRY
    process_data(data)
    return django.http.HttpResponse('Thank you')

def load_data_from_request(request):
    try:
        data_raw=json.loads(...)
    except ValueError, exc:
        raise BadRequest(exc)
    ...
    return data

原文由 guettli 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 483
2 个回答

您需要自定义中间件来处理您提出的异常。利用自定义异常检查中间件中的这种情况。

 class ErrorHandlingMiddleware(object):
    def process_exception(self, request, exception):
        if not isinstance(exception, errors.ApiException): # here you check if it yours exception
            logger.error('Internal Server Error: %s', request.path,
                exc_info=traceback.format_exc(),
                extra={
                    'request': request
                }
            )
        # if it yours exception, return response with error description
        try:
            return formatters.render_formatted_error(request, exception) # here you return response you need
        except Exception, e:
            return HttpResponseServerError("Error During Error Processing")

原文由 coldmind 发布,翻译遵循 CC BY-SA 4.0 许可协议

其他答案解释了如何返回状态为 400 的 HTTP 响应。

如果你想挂钩 Django 的 400 错误处理,你可以引发 SuspiciousOperation 异常或其子类。

请参阅 此处此处 的文档。

在您的示例中,它看起来像:

 from django.core.exceptions import SuspiciousOperation

def load_data_from_request(request):
    try:
        data_raw = json.loads(...)
    except ValueError:
        raise SuspiciousOperation('Invalid JSON')
    # ...
    return data

原文由 yprez 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏