【问题标题】:How can I encrypt url in Django Rest Framework?如何在 Django Rest Framework 中加密 url?
【发布时间】:2022-02-12 22:21:47
【问题描述】:

我找到了一个文档,因为它不适用于 python 更新版本,所以我遇到了这个问题。我想防止从我的应用程序中报废。有一些 api 我正在传递敏感数据,我的 api endpoing 就像 localhost:8000/api/products/1 但我希望这个 url 像 本地主机:8000/api/products/dheudhuehdeidiwf4yfg4gfy4yf4f4fu4f84j4i 这个。那么我应该在这里遵循什么程序呢?

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    您可以使用uuid 作为模型中的另一个唯一键。

    import uuid
    
    
    class Product(models.Model):
        uuid = models.UUIDField(unique=True, default=uuid.uuid4, editable=False)
        # other fields ...
    

    对于序列化程序,您必须手动设置它们:

    class ProductSerializer(serializers.Serializer):
        uuid = serializers.UUIDField(format="hex", read_only=True)
        # other fields ...
    
        class Meta:
            model = Product
            fields = [
                "uuid",
                # other fields ...
            ]
    

    对于视图,我假设您使用的是ModelViewSet,因此您可以将 uuid 设置为查找字段,例如:

    class ProductViewSet(viewsets.ModelViewSet):
        serializer_class = ProductSerializer
        lookup_field = "uuid"
    

    【讨论】:

      【解决方案2】:

      让您的敏感 ID 成为 urlsafe 的一种方法是使用来自 django.utils.httpurlsafe_base64_encode。您可以使用以下命令将加密的 ID 连同您对前端的响应一起返回:

      uidb64 = urlsafe_base64_encode(force_bytes(model_name.pk))

      然后,前端可以保存加密的 ID,当使用这些 ID 向您的端点发出请求时,您可以使用来自 django.utils.encodingsmart_str 解密它们,如下所示:

      model_name_pk = smart_str(urlsafe_base64_decode(uidb64))

      假设您的端点看起来像这样'api/an-interesting-route/<uidb64>'

      这种方法对于 GET 端点更有用,它不仅直接返回模型,而且在返回响应之前包括对 id 的一些处理。

      【讨论】:

        猜你喜欢
        • 2021-10-18
        • 2016-10-03
        • 1970-01-01
        • 2017-05-10
        • 1970-01-01
        • 2016-12-15
        • 2015-03-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多