mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2025-12-20 12:11:13 -05:00
- Add complete backend/ directory with full Django application - Add frontend/ directory with Vite + TypeScript setup ready for Next.js - Add comprehensive shared/ directory with: - Complete documentation and memory-bank archives - Media files and avatars (letters, park/ride images) - Deployment scripts and automation tools - Shared types and utilities - Add architecture/ directory with migration guides - Configure pnpm workspace for monorepo development - Update .gitignore to exclude .django_tailwind_cli/ build artifacts - Preserve all historical documentation in shared/docs/memory-bank/ - Set up proper structure for full-stack development with shared resources
36 lines
1.0 KiB
Python
36 lines
1.0 KiB
Python
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.")
|