Python/Django 请求 JSONDecodeError:期望值:第 1 行第 1 列(字符 0)

Posted

技术标签:

【中文标题】Python/Django 请求 JSONDecodeError:期望值:第 1 行第 1 列(字符 0)【英文标题】:Python/Django requests JSONDecodeError: Expecting value: line 1 column 1 (char 0) 【发布时间】:2021-12-05 02:48:41 【问题描述】:

我正在尝试制作微服务仓库/商店。一切正常,但是当我想将 celery 连接到我的项目时,出现错误 Expecting value: line 1 column 1 (char 0) when trying to start celery

@shared_task
def shop_sync():
    url = 'http://warehouse:8001/authors/'
    response_author = requests.get(url=url).json()
    while 1:
        for counter, data in enumerate(response_author['results']):
            Author.objects.get_or_create(
                id=data['id'],
                defaults=
                    'id': data['id'],
                    'first_name': data['first_name'],
                    'last_name': data['last_name']
                
            )

        if response_author['next']:
            response_author = requests.get(response_author['next']).json()
        else:
            break

    url = 'http://warehouse:8001/genres/'
    response_genre = requests.get(url).json()
    while 1:
        for counter, data in enumerate(response_genre['results']):
            Genre.objects.get_or_create(
                id=data['id'],
                defaults=
                    'id': data['id'],
                    'name': data['name']
                
            )

        if response_genre['next']:
            response_genre = requests.get(
                response_genre['next']
            ).json()
        else:
            break
    url = 'http://warehouse:8001/books/'
    response = requests.get(url).json()
    while 1:
        for counter, data in enumerate(response['results']):
            book, created = Book.objects.get_or_create(
                id=data['id'],
                defaults=
                    'id': data['id'],
                    "title": data['title'],
                    "description": data['description'],
                    "image": data['image'],
                    "language": data['language'],
                    "status": data['status'],
                    "price": data['price'],
                    "isbn": data['isbn'],
                    "pages": data['pages'],
                    "created": data['created'],
                    "available": data['available'],
                    "quantity": data['quantity'],
                    "genre": Genre.objects.get(id=data['genre'])
                
            )

            if not created:
                book.title = data['title']
                book.description = data['description']
                book.image = data['image']
                book.language = data['language']
                book.status = data['status']
                book.price = data['price']
                book.isbn = data['isbn']
                book.pages = data['pages']
                book.created = data['created']
                book.available = data['available']
                book.quantity = data['quantity']
                book.genre = Genre.objects.get(id=data['genre'])
                book.save()

            for i in data['author']:
                author = Author.objects.get(id=i)
                book.author.add(author)

        if response['next']:
            response = requests.get(response['next']).json()
        else:
            break
    print('Sync is done')

例外:

Traceback (most recent call last):
    File "/usr/local/lib/python3.9/site-packages/celery/app/trace.py", line 450, in trace_task
    R = retval = fun(*args, **kwargs)
    File "/usr/local/lib/python3.9/site-packages/celery/app/trace.py", line 731, in __protected_call__
    return self.run(*args, **kwargs)
    File "/code/shop/tasks.py", line 105, in shop_sync
    response = requests.get(url=url).json()
    File "/usr/local/lib/python3.9/site-packages/requests/models.py", line 910, in json
    return complexjson.loads(self.text, **kwargs)
    File "/usr/local/lib/python3.9/json/__init__.py", line 346, in loads
    return _default_decoder.decode(s)
    File "/usr/local/lib/python3.9/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    File "/usr/local/lib/python3.9/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
    json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

【问题讨论】:

您从 API 端点 (http://warehouse:8001/authors) 收到无效的 JSON。 您的 API 端点 'http://warehouse:8001/books/' 没有返回结果。你能分享/books/的结果吗? 即使在文档中找到,也不要直接使用requests.get(url).json()。在解码 JSON 之前始终检查响应代码。 【参考方案1】:

为避免代码中出现此类问题,您应首先检查响应状态代码,然后根据状态执行适当的操作。如:-

url = 'http://warehouse:8001/books/'
response = requests.get(url)
if response.status_code != 200:
   return

response_data = response.json()
while 1:
    for counter, data in enumerate(response_data['results']):
        book, created = Book.objects.get_or_create(
            id=data['id'],
            ...
            ...
        )

【讨论】:

以上是关于Python/Django 请求 JSONDecodeError:期望值:第 1 行第 1 列(字符 0)的主要内容,如果未能解决你的问题,请参考以下文章

python--django之视图函数

python---django请求-响应的生命周期(FBV和CBV含义)

python - django (视图)

Python Django之GET请求和POST请求及响应处理

3.Python Django之GET请求和POST请求及响应处理

Python/Django 请求 JSONDecodeError:期望值:第 1 行第 1 列(字符 0)