import requests from django.conf import settings from django.core.exceptions import ValidationError class TurnstileMixin: """ Mixin to handle Cloudflare Turnstile validation. Bypasses validation when DEBUG is True. """ def validate_turnstile(self, request): """ Validate the Turnstile response token. Skips validation when DEBUG is True. """ if settings.DEBUG: return token = request.POST.get('cf-turnstile-response') if not token: raise ValidationError('Please complete the Turnstile challenge.') # Verify the token with Cloudflare data = { 'secret': settings.TURNSTILE_SECRET_KEY, 'response': token, 'remoteip': request.META.get('REMOTE_ADDR'), } response = requests.post(settings.TURNSTILE_VERIFY_URL, data=data, timeout=60) result = response.json() if not result.get('success'): raise ValidationError('Turnstile validation failed. Please try again.')