如何在Django Rest Framework中加密url



我发现了一个文档,因为它不适用于python更新版本,所以我遇到了这个问题。我想防止我的申请被取消。有一些api是我传递敏感数据的地方,我的api结束操作就像localhost:8000/api/products/1,但我希望这个url像localhost:8000/api/products/dheudhuehdeidiwf4yfg4gfy4yf4f4fu4f84j4i this。那么我应该遵循哪个程序呢?

您可以将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"

使敏感id成为urlsafe的一种方法是使用django.utils.http中的urlsafe_base64_encode。您可以使用将加密的ID和响应一起返回到前端

uidb64=urlsafe_base64_encode(force_bytes(model_name.pk((

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

model_name_pk=smart_str(urlsafe_base64_decode(uidb64((

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

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

最新更新