Pluggable captcha support for Django REST Framework.
Project description
DRF-CaptchaX
A powerful and flexible CAPTCHA integration for Django REST Framework with multiple storage backends and customization options.
Features
- 🚀 Easy integration with Django REST Framework
- 🎨 Highly customizable CAPTCHA generation
- 💾 Multiple storage backends (Memory, Redis)
- ✨ Simple validation process
- 🔒 Secure by design
- 📱 Mobile-friendly
- 🌐 Internationalization support
- ⚡ High performance
- 🧪 Comprehensive test suite
Installation
pip install drf-captchax
Quick Start
- Add 'captchax' to your
INSTALLED_APPS:
INSTALLED_APPS = [
...
'rest_framework',
'captchax',
]
- Include CAPTCHA URLs in your project's
urls.py:
from django.urls import path, include
urlpatterns = [
...
path('captcha/', include('captchax.urls')),
]
- Configure CAPTCHA settings in your Django settings:
CAPTCHAX = {
# CAPTCHA Generation
'LENGTH': 6, # Length of CAPTCHA text
'WIDTH': 200, # Image width
'HEIGHT': 60, # Image height
'FONT_SIZE': 36, # Font size
'BACKGROUND_COLOR': '#ffffff', # Background color
'TEXT_COLOR': '#000000', # Text color
'NOISE_LEVEL': 20, # Noise level (0-100)
'USE_LINES': True, # Add random lines
'USE_DOTS': True, # Add random dots
# Validation
'TIMEOUT': 300, # CAPTCHA validity period in seconds
'CASE_SENSITIVE': False, # Case-sensitive validation
'MAX_ATTEMPTS': 5, # Maximum validation attempts
# Storage Backend
'BACKEND': 'captchax.backend.memory.MemoryBackend', # Default backend
# For Redis backend:
# 'BACKEND': 'captchax.backend.redis.RedisBackend',
# 'REDIS_URL': 'redis://localhost:6379/0',
# 'REDIS_PREFIX': 'captchax:',
}
- Use in your serializers:
from rest_framework import serializers
from captchax.validator import CaptchaValidator
class RegistrationSerializer(serializers.Serializer):
username = serializers.CharField()
email = serializers.EmailField()
password = serializers.CharField(write_only=True)
captcha_id = serializers.CharField()
captcha_text = serializers.CharField(validators=[CaptchaValidator()])
- Frontend Integration:
<!-- Template -->
<form method="post" action="/api/register/">
<!-- Your form fields -->
<div class="captcha-container">
<img id="captcha-image" alt="CAPTCHA">
<button type="button" onclick="refreshCaptcha()">↻</button>
<input type="hidden" name="captcha_id" id="captcha-id">
<input type="text" name="captcha_text" required>
</div>
</form>
<!-- JavaScript -->
<script>
function refreshCaptcha() {
fetch('/captcha/generate/')
.then(response => response.json())
.then(data => {
document.getElementById('captcha-image').src = data.image;
document.getElementById('captcha-id').value = data.captcha_id;
});
}
// Refresh CAPTCHA on page load
document.addEventListener('DOMContentLoaded', refreshCaptcha);
</script>
<!-- Optional CSS -->
<style>
.captcha-container {
display: flex;
align-items: center;
gap: 10px;
margin: 15px 0;
}
</style>
Advanced Usage
Custom Validation
from captchax.validator import CaptchaValidator
# Case-sensitive validation
validator = CaptchaValidator(case_sensitive=True)
# Custom maximum attempts
validator = CaptchaValidator(max_attempts=3)
# Custom backend
from captchax.backend.redis import RedisBackend
validator = CaptchaValidator(
backend_class=RedisBackend,
redis_url='redis://localhost:6379/0'
)
Custom CAPTCHA Generation
from captchax.captcha import CaptchaGenerator
generator = CaptchaGenerator(
length=8,
width=300,
height=80,
font_size=42,
background_color='#f0f0f0',
text_color='#333333',
noise_level=30
)
captcha_id, image = generator.generate_image()
Redis Backend Configuration
For production environments, it's recommended to use the Redis backend:
CAPTCHAX = {
'BACKEND': 'captchax.backend.redis.RedisBackend',
'REDIS_URL': 'redis://localhost:6379/0',
'REDIS_PREFIX': 'captchax:',
# Other settings...
}
API Endpoints
-
GET /captcha/generate/: Generate a new CAPTCHA- Returns:
{"captcha_id": "...", "image": "data:image/png;base64,..."}
- Returns:
-
POST /captcha/validate/: Validate a CAPTCHA response- Data:
{"captcha_id": "...", "captcha_text": "..."} - Returns:
200 OKif valid,400 Bad Requestif invalid
- Data:
Testing
# Install development dependencies
pip install -e ".[dev]"
# Run tests
pytest
# Run tests with coverage
pytest --cov=captchax
Contributing
Contributions are welcome! Here's how you can help:
- Fork the repository
- Create a feature branch:
git checkout -b feature-name - Make your changes and commit:
git commit -m 'Add feature' - Push to the branch:
git push origin feature-name - Submit a pull request
Please make sure to:
- Follow the existing code style
- Add tests for new features
- Update documentation as needed
License
This project is licensed under the MIT License - see the LICENSE file for details.
Credits
Created and maintained by Alireza Alibolandi.
Support
- 📫 Report issues on GitHub
- 📚 Read the documentation
- 💬 Ask questions on Stack Overflow
Star History
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file drf_captchax-0.1.0.tar.gz.
File metadata
- Download URL: drf_captchax-0.1.0.tar.gz
- Upload date:
- Size: 14.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.10.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
868ab4189ce0387214e58b2a25f4d720677f6cee1ceb0930dd896de473ce0a16
|
|
| MD5 |
0d37c2ec976715ab5c8f8d9067557b59
|
|
| BLAKE2b-256 |
602c3eb14f83434f2d79d877aa3192d695ad514647a76a190a05eea7c6b28986
|
File details
Details for the file drf_captchax-0.1.0-py3-none-any.whl.
File metadata
- Download URL: drf_captchax-0.1.0-py3-none-any.whl
- Upload date:
- Size: 12.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.10.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
71b2397d3ef9c6856f49d46590a0179e6799e353d3951bc0faf596eb591b2f3a
|
|
| MD5 |
c9053df0e700876323d7ca4bd7291415
|
|
| BLAKE2b-256 |
a1297c22b2379109938310a8de387886a3b0ef19a50f53d26a781d180bd8ac70
|