gpt4 book ai didi

python - JSON 中的大整数被 Angular 而不是 CURL 损坏?

转载 作者:太空狗 更新时间:2023-10-29 22:25:26 26 4
gpt4 key购买 nike

我使用 Django Rest Framework 创建了一个 Django REST API .

我使用 3 个不同的客户端来访问这个应用程序:

  • Curl(用于调试目的)
  • Swagger 接口(interface)(用于调试目的)
  • 我的 Angular 应用

我有一个令人困惑的问题,即 API 返回的数据被 Swagger 和 Angular 而不是 Curl 破坏了。

我的 Django 模型如下所示:

class MyModel1(CachingMixin, models.Model):
id = models.BigIntegerField(default=make_id, primary_key=True)
name = models.CharField(max_length=50, null=False, blank=False,)

上面提到的make_id()方法描述了here .我最近从标准的 Django 分配和自动递增的主键中实现了这一变化。作为更改的一部分,我将 id 从 IntegerField 转换为 BigIntegerField

我有一些其他的 Django View 代码(我没有在这里显示)创建一个名为 GetMyModel1ByName 的端点。该端点返回 MyModel1 的序列化实例。这是显示当我到达该端点时发生的情况的 curl 。它完美地工作:

$ curl http://localhost:4212/api/getMyModel1ByName/?name=my-name
{"id": 10150133855458395, "name": "my-name"}

现在,当我从 Chrome 的开发者控制台访问同一个端点时会发生什么:

> $http = angular.element(document.body).injector().get('$http');
> $http.get("http://localhost:4212/api/getMyModel1ByName/?name=my-name").then(function(response) { console.log(JSON.stringify(response.data)) }).catch(function (error) { console.log(error.data) });
{"id":10150133855458396, "name":"my-name"}

如您所见,curl 将 ID 报告为 10150133855458395。这是正确的。这就是数据库中的内容。但是 Angular 将其报告为 10150133855458396。最后的数字是错误的。相差1,很惊喜!

这是一个真正令人费解的错误。我的 Django 代码非常简单,我非常有信心其中没有错误。相反,我觉得将 id 字段从 IntegerField 更改为 BigIntegerField 可能会导致此问题。为什么会发生,解决方案是什么??它破坏了我的应用程序的功能。当我通过 Swagger 到达此端点时,我看到了同样的损坏。

编辑:另一个提问者遇到了我同样的问题。很高兴知道我不是唯一一个!然而,关于那个问题的答案并不是真正的答案。他们不解释原因。而且他们没有告诉我应该如何解决我的 Angular JS 代码中的问题。

最佳答案

您正在尝试存储一个大于安全最大 javascript 整数 value(+/- 9007199254740991) 的数字。

您的 make_id 生成器应该返回关于 javascript 限制的值。

更多信息请阅读: http://blog.vjeux.com/2010/javascript/javascript-max_int-number-limits.html

关于python - JSON 中的大整数被 Angular 而不是 CURL 损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37890762/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com