我正在使用 django 框架编写一个应用程序,并正在考虑编写类似休息控制器的东西,因为将异常处理逻辑保留在一个地方似乎是一个好主意。我不知道执行此操作的正确方法是什么,但我想出了一个装饰器,其中包含一堆可能由各种方法引发的异常,因此,每个方法都使用该装饰器。
def exception_handler(function):
def wrapper(*args, **kwargs):
try:
return function(*args, **kwargs)
except Error1 as error:
return Response(
{"Error": str(error)},
status=status.HTTP_400_BAD_REQUEST
)
except Error2 as error:
return Response(
{"Error": str(error)},
status=status.HTTP_404_NOT_FOUND
)
except Error3 as error:
return Response(
{"Error": str(error)},
status=status.HTTP_503_SERVICE_UNAVAILABLE
)
return wrapper
Run Code Online (Sandbox Code Playgroud)
其中Error1、Error2和Error3只是一些抽象错误。在我的应用程序中确实有更多这样的情况。
简单的控制器(又名 django 视图)可能看起来像这样:
class DeviceView(viewsets.ModelViewSet):
lookup_field = 'id'
serializer_class = DeviceSerializer
@exception_handler
def create(self, request):
serializer = self.serializer_class(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save(data=request.data)
return Response(status=status.HTTP_200_OK)
Run Code Online (Sandbox Code Playgroud)
因此,基本上,如果抛出任何异常,都会以适当的方式进行处理。我在这里看到的问题之一是,如果不是我提出带有所需消息的异常:
if some_condition:
raise SomeException("Something happened")
Run Code Online (Sandbox Code Playgroud)
这将是默认的,我通常更愿意更改它。因此,我开始对控制向客户显示哪些消息感到有些不舒服。我现在能想到的最好的办法是: …
我有一个嵌套的json对象。为了简单起见:
data = {'key1': 1, 'key2': 2, 'key3': {'nestedKey1': 3, 'nestedKey2': 4}}
Run Code Online (Sandbox Code Playgroud)
一个真实的对象更大,但要点是它是一个嵌套的对象。值可以是字符串,数字或其他对象。现在,我需要获取一个excel表(对于此特定的json如下所示):
|----------------------------------------
| key1 | key2 | key3 |
| | |--------------------------
| | | nestedKey1 | nestedKey2 |
|----------------------------------------
| 1 | 2 | 3 | 4 |
|----------------------------------------
Run Code Online (Sandbox Code Playgroud)
为了做到这一点,我尝试使用xlsx库。我导入库,如下所示:
import { WorkSheet, WorkBook, utils, writeFile } from 'xlsx';
Run Code Online (Sandbox Code Playgroud)
在我的方法中,我定义了对象:
let myObj = {'key1': 1, 'key2': 2, 'key3': {'nestedKey1': 3, 'nestedKey2': 4}}
Run Code Online (Sandbox Code Playgroud)
然后创建一个工作表和工作簿:
const workSheet: WorkSheet = utils.json_to_sheet([myObj]);
const workBook: WorkBook = utils.book_new();
utils.book_append_sheet(workBook, workSheet, 'object_to_save');
Run Code Online (Sandbox Code Playgroud)
最后将其写入文件: …