【问题标题】:Django Rest Framework: Generate a unique obfuscated ID from ID fieldDjango Rest Framework:从 ID 字段生成唯一的混淆 ID
【发布时间】:2018-04-21 06:32:12
【问题描述】:

我目前正在学习如何为我的公司构建 API。我已经很久没有这样做了,所以我现在基本上是一名初级开发人员。

按照一些教程,我使用基于类的视图启动并运行了我的 API。

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

我试图弄清楚如何在不泄露此类信息的情况下将“id”添加到我的序列化程序的字段中,以帮助查找参数和 url。

以前,客户在 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'),)

关于 serializers.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 generate unique ID”,但我得到了不相关的结果,或者我不够先进,无法解析结果并找到我需要的东西。正如我所提到的,我对此很陌生,但解决问题很有趣!

【问题讨论】:

    标签: python json django rest django-rest-framework


    【解决方案1】:

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

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

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

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2013-05-31
      • 1970-01-01
      • 1970-01-01
      • 2017-11-27
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多