我发现了一个文档,因为它不适用于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_str
从django.utils.encoding
解密它们,如下所示:
model_name_pk=smart_str(urlsafe_base64_decode(uidb64((
假设你的端点看起来像这个'api/an-interesting-route/<uidb64>'
这种方法对于GET端点更有用,这些端点不仅直接返回模型,而且在返回响应之前还包括对id的一些处理。