Hola,
En una app Django que estoy haciendo (usando el template cookiecutter-django), tengo el módulo django-cities-light para proveer los países, pero necesitaría que no necesite el header X-CSRFToken.
Para eso hice una nueva app de Django pero todos mis intentos para deshabilitar la validación de csrf fueron infructuosos, tanto usando el decorador csrf_excempt como definiendo un SessionAuthentication handler. En todos los casos tengo el mismo resultado sin el header tengo error 403 y con el header tengo el resultado. ¿Alguien tiene alguna idea de como podría hacerlo?
El código relevante:
api_router.py:
from django.urls import include, path
from rest_framework.routers import DefaultRouter, SimpleRouter
from system_help_me.countries.views import CustomCountryModelViewSet
if settings.DEBUG:
router = DefaultRouter()
else:
router = SimpleRouter()
router.register(
r"countries", CustomCountryModelViewSet, basename="cities-light-api-country"
)
urlpatterns = [
path("", include("dj_rest_auth.urls")),
path("registration/", include("dj_rest_auth.registration.urls")),
]
app_name = "api"
urlpatterns += router.urls
views.py:
from cities_light.contrib.restframework3 import Country, CountryModelViewSet
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt
from rest_framework.serializers import ModelSerializer
from rest_framework.authentication import SessionAuthentication, BasicAuthentication
# Create your views here.
class CsrfExemptSessionAuthentication(SessionAuthentication):
def enforce_csrf(self, request):
return # To not perform the csrf check previously happening
class CustomCountrySerializer(ModelSerializer):
class Meta:
model = Country
fields = "__all__"
# this disables the csrf validation for the country viewset
# @method_decorator(csrf_exempt, name='dispatch')
class CustomCountryModelViewSet(CountryModelViewSet):
authentication_classes = (CsrfExemptSessionAuthentication, ) # BasicAuthentication)
serializer_class = CustomCountrySerializer
queryset = Country.objects.all()
#@method_decorator(csrf_exempt)
#def dispatch(self, *args, **kwargs):
# return super().dispatch(*args, **kwargs)
Muchas gracias,
Javier.