我在ViewSet中有一个方法,我想验证request.data是一个列表.如果不是,我想提高ParseError()分.

然而,当我实际提出said ParseError时,我的代码崩溃了,我不明白为什么.它是APIException的一个子类,documentation个状态将自动处理.

# views.py
class MyViewSet(viewsets.GenericViewSet):
    ...

    @action(methods=['post'], detail=False, url_path='bulk-create')
    def bulk_create(self, request, *args, **kwargs):
        # Assert that request.data is a list of objects
        if not isinstance(request.data, list):
            raise ParseError("Expected the data to be in list format.")

        # Actually process incoming data
        ...

使用列表以外的任何内容调用路由都会正确触发我的if语句,但服务器崩溃,而不是返回正确的status.HTTP_400_BAD_REQUEST响应,我收到以下错误:

Traceback (most recent call last):
2022-05-17T12:23:45.366216553Z   File "/opt/venv/lib/python3.9/site-packages/django/core/handlers/exception.py", line 47, in inner
2022-05-17T12:23:45.366221178Z     response = get_response(request)
2022-05-17T12:23:45.366223345Z   File "/opt/venv/lib/python3.9/site-packages/debug_toolbar/middleware.py", line 67, in __call__
2022-05-17T12:23:45.366225470Z     panel.generate_stats(request, response)
2022-05-17T12:23:45.366238220Z   File "/opt/venv/lib/python3.9/site-packages/debug_toolbar/panels/request.py", line 30, in generate_stats
2022-05-17T12:23:45.366240470Z     "post": get_sorted_request_variable(request.POST),
2022-05-17T12:23:45.366346803Z   File "/opt/venv/lib/python3.9/site-packages/debug_toolbar/utils.py", line 227, in get_sorted_request_variable
2022-05-17T12:23:45.366352511Z     return [(k, variable.getlist(k)) for k in sorted(variable)]
2022-05-17T12:23:45.366354803Z TypeError: '<' not supported between instances of 'dict' and 'dict'

由于错误日志(log),我怀疑django-debug-toolbar与我的问题有关.我已经try 将其移动到中间件配置中的每个位置,但这并没有解决我的问题.

# settings.py
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'corsheaders.middleware.CorsMiddleware',
    'debug_toolbar.middleware.DebugToolbarMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django_currentuser.middleware.ThreadLocalUserMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'rollbar.contrib.django.middleware.RollbarNotifierMiddleware',
]

EDIT:我知道排序有时会失败,但为什么排序会首先发生?

EDIT 2:django-debug-toolbar岁以上的人帮我确认,是JSON格式的数组在引发异常时与库发生冲突.

推荐答案

多亏了django-debug-toolbar的优秀员工,该库现在也可以处理POST.data中的顶级array.https://github.com/jazzband/django-debug-toolbar/pull/1624

遗憾的是,我在Django的测试系统中直接遇到了同样的问题...

# test_with_error.py

from rest_framework.test import APITestCase

class DonationBulkCreateRouteTestCase(APITestCase):
    def test_route_permissions(self):
        self.client.post(
            path="/bulk-create/",
            data=json.dumps([], default=json_serializer)
        )

# log.txt

File "/opt/venv/lib/python3.9/site-packages/django/test/client.py", line 245, in encode_multipart
    for (key, value) in data.items():
AttributeError: 'str' object has no attribute 'items'

因此,尽管顶级数组是有效的JSON,但我决定将数据包装在另一个对象中,并在其中传递列表.这还有一个额外的好处,就是将来更容易扩展,因为我可以在不 destruct 现有代码的情况下自由添加密钥.

Python相关问答推荐

如何终止带有队列的Python进程?+ 队列大小的错误?

如何使用Python中的clinicalTrials.gov API获取完整结果?

比较两个二元组列表,NP.isin

Odoo 14 hr. emergency.public内的二进制字段

Deliveryter Notebook -无法在for循环中更新matplotlib情节(保留之前的情节),也无法使用动画子功能对情节进行动画

处理(潜在)不断增长的任务队列的并行/并行方法

对整个 pyramid 进行分组与对 pyramid 列子集进行分组

根据二元组列表在pandas中创建新列

如何在python polars中停止otherate(),当使用when()表达式时?

考虑到同一天和前2天的前2个数值,如何估算电力时间序列数据中的缺失值?

基于形状而非距离的两个numpy数组相似性

ModuleNotFoundError:没有模块名为x时try 运行我的代码''

提高算法效率的策略?

freq = inject在pandas中做了什么?''它与freq = D有什么不同?''

Js的查询结果可以在PC Chrome上显示,但不能在Android Chrome、OPERA和EDGE上显示,而两者都可以在Firefox上运行

如何在Python中自动创建数字文件夹和正在进行的文件夹?

Python:从目录内的文件导入目录

我怎么才能用拉夫分拣呢?

Django抛出重复的键值违反唯一约束错误

如何从一个维基页面中抓取和存储多个表格?