Me preguntaba qué pasa con el error CSRF Cookie not set que Django me arroja todo el tiempo. Creé una vista (ver a continuación) que es una devolución de llamada para un pago. No tengo ninguna influencia de lo que se envía a esa vista. Revisé otras publicaciones en StackOverflow, pero no creo que ninguna se aplique a mí. La mayoría de ellos pueden simplemente implementar una protección csrf en sus formularios, csrf_exempt sus vistas o usan rest_framework.
class PaymentWebhook(View): def post(self, request, *args, **kwargs): # ...Ahora, recibo este error cada vez que no hago nada con esta función:
Forbidden (CSRF cookie not set.): /payment/webhook Dado que se trata de pagos, ¿puedo simplemente csrf_exempt esto, o eso solo abriría un agujero de seguridad? Por cierto, incluso he intentado poner una exención en esta función, pero aún arroja ese error. ¿Alguna sugerencia?
Finalmente logré obtener un POST. Estoy bastante seguro de que ya lo había probado, pero parecía funcionar ahora: puse un csrf_exempt en mi urls.py
from django.views.decorators.csrf import csrf_exempt url(r'^payment/webhook$', csrf_exempt(paymentwebhook), name='payment-webhook')De otra manera, no me funcionaría por alguna razón. Gracias nik_m por la ayuda, ¡lo aprecio!
Deberías decorar el método de dispatch con csrf_exempt , así:
from django.views.decorators.csrf import csrf_exempt from django.utils.decorators import method_decorator class PaymentWebhook(View): @method_decorator(csrf_exempt) def dispatch(self, request, *args, **kwargs): return super(PaymentWebhook, self).dispatch(request, *args, **kwargs) # for python 2 return super().dispatch(request, *args, **kwargs) # for python 3 def post(self, request, *args, **kwargs): # ...o, en base a esto , puede limpiarlo para:
from django.views.decorators.csrf import csrf_exempt from django.utils.decorators import method_decorator @method_decorator(csrf_exempt, name='dispatch') class PaymentWebhook(View): def post(self, request, *args, **kwargs): # ...Esto es lo que hice (importar csrf_exempt)
from django.views.decorators.csrf import csrf_exempt @csrf_exempt @api_view(['POST']) def add(request):