Django:如何生成get-param或404函数



我希望我的端点抛出一个404状态代码,其中包含一条类似";未找到参数foo";如果请求缺少必填字段。由于我有太多的端点,添加3行代码(try,except,return(对我来说不是一个愉快的解决方案。这就是为什么我想制作一个类似于django.shortcuts中的get_object_or_404的函数,其中只使用该函数,请求就会返回404,而不仅仅是引发异常并使服务器崩溃。

看看get_object_or_404函数,我注意到它执行raise Http404,这确实有效,但它总是返回"细节":"未找到";忽略我传递给引发异常代码的任何参数。

以下是我所做的:

class ParamNotFound(Exception):
def __init__(self, param_name):
self.param_name = param_name
self.status_code = 404
def __str__(self) -> str:
return f"Param {self.param_name} not found"

def get_body_param_or_404(params, param_name: str):
param = params.get(param_name, None)
if param is None:
raise ParamNotFound(f"param_name {param_name} not found")
return param

但是,如果我没有明确捕捉到它,这只会引发一个异常并使服务器崩溃。
有一种干净而简单的方法可以做到这一点吗?

答案比我想象的要复杂。我最终实现了一个中间件,在那里我可以捕捉到返回自定义JsonResponse的异常。

class ParamMiddleware:
def __init__(self, get_response) -> None:
self.get_response = get_response
def __call__(self, request):
return self.get_response(request)
def process_exception(self, request, exception):
if isinstance(exception, ParamNotFound):
return JsonResponse({"msg": str(exception), "status": 404})

最新更新