Django Rest framework как наложить ограничение на публичный api для неаутентифицированных пользователей?
У меня есть contact forms api для неаутентифицированного пользователя. Так что любой может посетить мой сайт и отправить формы. Я интегрировал свой api в reactjs. Но любой может просмотреть json данные, если он напрямую посетит api url. Любой может также отправить пост-запрос с помощью POSTMAN, используя api url. Как ограничить просмотр страницы api любым человеком, а также предотвратить несанкционированный запрос на пост.
вот мой код:
settings.py:
REST_FRAMEWORK = {
# Only enable JSON renderer by default.
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.JSONRenderer',
],
'DEFAULT_THROTTLE_CLASSES': [
'rest_framework.throttling.AnonRateThrottle',
],
'DEFAULT_THROTTLE_RATES': {
'anon': '10/minute',
}
}
views.py
api_view(['POST', 'GET'])
def farhyn_api(request):
if request.method == 'POST':
data = request.data
serializer = ContactSerializer(data=data)
if serializer.is_valid():
serializer.save()
print(serializer.data)
return Response({
'status': True,
'message': 'sucess'
})
return Response({
'status': False,
'message': serializer.errors
})
if request.method == "GET":
contact = Contact.objects.all()
serializer = ContactSerializer(contact, many=True)
return Response(serializer.data)
Я использовал AnonRateThrottle, но все равно теперь любой может отправить POST запрос, используя api url. Как это предотвратить? В принципе, я хочу разрешить запрос, если он действительно пришел с моего сайта, а также как ограничить доступ к странице api?
У вас есть permission_classes
и IsAuthenticated
.
Просто сделайте следующее?
from rest_framework.permissions import IsAuthenticated
from rest_framework.decorators import permission_classes
api_view(['POST', 'GET'])
@permission_classes((IsAuthenticated, )) # < --------
def farhyn_api(request):
if request.method == 'POST':
data = request.data
serializer = ContactSerializer(data=data)
if serializer.is_valid():
serializer.save()
print(serializer.data)
return Response({
'status': True,
'message': 'sucess'
})
return Response({
'status': False,
'message': serializer.errors
})
if request.method == "GET":
contact = Contact.objects.all()
serializer = ContactSerializer(contact, many=True)
return Response(serializer.data)