【问题标题】: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.http 的 urlsafe_base64_encode。您可以使用以下命令将加密的 ID 连同您对前端的响应一起返回:
uidb64 = urlsafe_base64_encode(force_bytes(model_name.pk))
然后,前端可以保存加密的 ID,当使用这些 ID 向您的端点发出请求时,您可以使用来自 django.utils.encoding 的 smart_str 解密它们,如下所示:
model_name_pk = smart_str(urlsafe_base64_decode(uidb64))
假设您的端点看起来像这样'api/an-interesting-route/<uidb64>'
这种方法对于 GET 端点更有用,它不仅直接返回模型,而且在返回响应之前包括对 id 的一些处理。