Как я могу зашифровать url в Django Rest Framework?
Я нашел документацию, но она не работает с обновленной версией python, поэтому у меня такая проблема. Я хочу предотвратить отбраковку из моего приложения. Есть несколько api, куда я передаю конфиденциальные данные, и мой api endpoing выглядит как 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"
Одним из способов сделать чувствительные идентификаторы безопасными для urlsafe было бы использование urlsafe_base64_encode из django.utils.http. Вы можете возвращать зашифрованные идентификаторы вместе с ответом на frontend, используя:
uidb64 = urlsafe_base64_encode(force_bytes(имя_модели.pk))
фронтенд может сохранять зашифрованные идентификаторы, и когда запрос делается к вашим конечным точкам с использованием этих идентификаторов, вы расшифровываете их с помощью smart_str из django.utils.encoding следующим образом:
имя_модели_пк = smart_str(urlsafe_base64_decode(uidb64)))
при условии, что ваши конечные точки выглядят примерно так 'api/an-interesting-route/<uidb64>'
Этот подход более полезен для конечных точек GET, которые не просто возвращают модель напрямую, а включают некоторое количество обработки id перед возвращением ответа.