【发布时间】:2016-06-02 17:31:29
【问题描述】:
我正在编写几个视图,并希望验证请求正文。常见的情况是主体必须是具有某些键的 JSON 对象。我写了一个视图,并且有这个代码:
try:
body = json.loads(request.body)
except ValueError:
return InvalidInputResponse("Could not load request body")
if not isinstance(body, dict):
return InvalidInputResponse("Request body was not a JSON object")
if set(body.keys()) != {'author', 'title', 'content'}:
return InvalidInputResponse("Request object missing keys")
InvalidInputResponse 是http.HttpResponse 的子类。
我想在其他视图中重复使用此代码。我真正想做的是:
body = process_body(request.body, required_keys={'author', 'title', 'content'})
# rest of code here ...
但是,按照现在的代码,我不能这样做。我必须这样做:
body = process_body(request.body, required_keys={'author', 'title', 'content'})
if isinstance(body, http.HttpResponse):
return body
# rest of code here ...
这有点难看。
在 Flask 中,我可以创建一个自定义异常,称为 InvalidInputException,然后是 register an error handler for it... 比如说:
@app.errorhandler(InvalidInputException)
def handle_invalid_input(error):
return InvalidInputResponse(error.reason)
Django 中是否有等效机制?如果没有等效的机制,那么等效的处理方式是什么?
【问题讨论】:
-
在 Django 中也有类似的路径。使用
process_exception()处理程序编写自定义中间件。全局附加或通过decorator_from_middleware
标签: python django error-handling flask