python - Django休息框架: Generate a unique obfuscated ID from ID field

标签 python json django rest django-rest-framework

我目前正在学习如何为我的公司构建 API。我从事这行的时间并不长,所以目前我基本上还是一名初级开发人员。

按照一些教程,我使用基于类的 View 在非常基本的级别上启动并运行了 API。

以前,我将“id”作为我的几个序列化器的字段之一。我的经理不喜欢这样,他指出这会泄露有关我们业务的潜在敏感信息(如果您的 JSON 得到 customer_id = 13,那么您可以推断还有 12 个其他客户,如果您得到 job_id = 5433 那么您可以推断还有 5432 个其他工作等)。

我正在尝试找出如何将“id”添加到我的序列化器字段而不泄露此类信息,以帮助查找参数和网址。

以前,客户在 API 上的 URL 为 www.example.com/api/customer/5,5 是数据库中的“pk”,并将返回该客户的 JSON 数据。

我不知道如何使用 pk,但以某种方式混淆它。

models.py 上的客户模型

class Customer(models.Model):
    company_name = models.CharField(max_length=100)
    contact_name = models.CharField(max_length=100)
    contact_email = models.CharField(max_length=100)
    user = models.OneToOneField(User)

    @staticmethod
    def get_absolute_url():
        return reverse('details')

    def __str__(self):
        return self.company_name + ', ' + self.contact_name + ' (' + .contact_email + ')'

    class Meta:
        unique_together=(('contact_email','user'),)

关于序列化器.py

class CustomerListSerializer(ModelSerializer):
    url = HyperlinkedIdentityField(
        view_name='api:customer_list_detail',
        lookup_field='pk'
    )
    delete_url = HyperlinkedIdentityField(
        view_name='api:customer_list_delete',
        lookup_field='pk'
    )
    user = SerializerMethodField()
    class Meta:
        model = Customer
        fields = [
            'id',
            'url',
            'company_name',
            'contact_name',
            'contact_email',
            'user',
            'delete_url'
        ]
    def get_user(self, obj):
        return str(obj.user.name)

我尝试过的:

id = str(serializers.UUIDField(format=hex))

它只是返回与之前相同的 ID。我以为这是一种生成唯一编号的方法,但似乎并非如此。

我尝试在谷歌上搜索“django rest api generated unique ID”,但我得到了不相关的结果,或者我还不够先进,无法解析结果并找到我需要的内容。正如我所提到的,我对此很陌生,但是解决问题很有趣!

最佳答案

我不知道这是否适合您的情况,但我建议您可以向模型添加另一个唯一字段,而不是混淆现有的 ID 字段:a UUIDField

这样,您可以将“uuid”而不是“id”传递给序列化器,然后使用“uuid”进行查找(因为它保证也是唯一的)。这样,您就不会泄露数据量,同时仍然能够执行查询。

不过,在向现有模型添加唯一字段时应小心。幸运的是,django docs 中有一个关于将 UUIDField 精确添加到现有模型的示例。 .

希望这有帮助!

关于python - Django休息框架: Generate a unique obfuscated ID from ID field,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47181946/

相关文章:

python - 如何在单次遍历中找到python链表中的中间元素?

python - 如何在 pygame 中绘制类对象列表?

javascript - 使用循环在每个 json 子对象上获取本地存储中的 Json 数据

java - DataInputStream 是否会跳过字符?

python - Django:在 init 中访问 form_kwargs

Python:将 (4,1,2) 数组与 (4,1) 相乘得到 (4,1,2) 数组

python - 如何在 python 中 append 用户输入(整数)和字符串?

c# - 解析 Json facebook c#

django - 服务器重启后如何通过 Django manage.py 启动 Gunicorn

django - 如何使用 max(date) 值过滤查询