API Reference
This page documents the complete API for django-honeyguard.
Models
HoneyGuard models for logging honeypot detections.
- class django_honeyguard.models.TimingIssue(*values)[source]
Bases:
TextChoices- TOO_FAST = 'too_fast'
- TOO_SLOW = 'too_slow'
- VALID = 'valid'
- class django_honeyguard.models.RequestMethod(*values)[source]
Bases:
TextChoices- GET = 'GET'
- POST = 'POST'
- class django_honeyguard.models.HoneyGuardLog(*args, **kwargs)[source]
Bases:
ModelLog entry for honeypot detection events.
- ip_address
A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.
- path
A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.
- username
A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.
- password
A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.
- user_agent
A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.
- referer
A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.
- accept_language
A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.
- accept_encoding
A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.
- method
A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.
- honeypot_triggered
A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.
- timing_issue
A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.
- elapsed_time
A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.
- raw_metadata
A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.
- created_at
A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.
- updated_at
A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.
- property is_bot
Check if this appears to be bot activity.
- property risk_score
Calculate a simple risk score based on detection flags.
- Returns:
Risk score between 0 and 100
- Return type:
- exception DoesNotExist
Bases:
ObjectDoesNotExist
- exception MultipleObjectsReturned
Bases:
MultipleObjectsReturned
- get_method_display(*, field=<django.db.models.fields.CharField: method>)
- get_next_by_created_at(*, field=<django.db.models.fields.DateTimeField: created_at>, is_next=True, **kwargs)
- get_next_by_updated_at(*, field=<django.db.models.fields.DateTimeField: updated_at>, is_next=True, **kwargs)
- get_previous_by_created_at(*, field=<django.db.models.fields.DateTimeField: created_at>, is_next=False, **kwargs)
- get_previous_by_updated_at(*, field=<django.db.models.fields.DateTimeField: updated_at>, is_next=False, **kwargs)
- get_timing_issue_display(*, field=<django.db.models.fields.CharField: timing_issue>)
- id
A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.
- objects = <django.db.models.manager.Manager object>
Views
Views for fake admin pages (honeypots).
- class django_honeyguard.views.FakeAdminView(*args: Any, **kwargs: Any)[source]
Bases:
FormViewBase view for fake admin pages that act as honeypots.
- success_url = '/'
- error_message = 'Authentication failed.'
- get_error_message() str[source]
Get error message to display to user.
Override in subclasses to provide specific error messages.
- Returns:
Error message text
- Return type:
- dispatch(request: HttpRequest, *args: Any, **kwargs: Any) HttpResponse[source]
Store signed render time for timing detection.
- get(request: HttpRequest, *args: Any, **kwargs: Any) HttpResponse[source]
Handle GET requests - optionally trigger honeypot detection.
- post(request: HttpRequest, *args: Any, **kwargs: Any) HttpResponse[source]
Handle POST requests - always show error message.
- form_valid(form: BaseForm) HttpResponse[source]
Handle valid form submission - always trigger honeypot detection.
- class django_honeyguard.views.FakeDjangoAdminView(*args: Any, **kwargs: Any)[source]
Bases:
FakeAdminViewFake Django admin login page honeypot.
- form_class
alias of
FakeDjangoLoginForm
- template_name = 'django_honeyguard/django_admin_login.html'
- class django_honeyguard.views.FakeWPAdminView(*args: Any, **kwargs: Any)[source]
Bases:
FakeAdminViewFake WordPress admin login page honeypot.
- form_class
alias of
FakeWordPressLoginForm
- template_name = 'django_honeyguard/wp_admin_login.html'
Forms
- class django_honeyguard.forms.BaseFakeLoginForm(data=None, files=None, auto_id='id_%s', prefix=None, initial=None, error_class=<class 'django.forms.utils.ErrorList'>, label_suffix=None, empty_permitted=False, field_order=None, use_required_attribute=None, renderer=None, bound_field_class=None)[source]
Bases:
Form- username_required_message = 'This field is required.'
- password_required_message = 'This field is required.'
- is_honeypot_triggered() bool[source]
Check if the honeypot field was filled (indicating bot activity).
- base_fields = {'hp': <django.forms.fields.CharField object>, 'render_time': <django.forms.fields.CharField object>}
- declared_fields = {'hp': <django.forms.fields.CharField object>, 'render_time': <django.forms.fields.CharField object>}
- property media
Return all media required to render the widgets on this form.
- class django_honeyguard.forms.FakeDjangoLoginForm(data=None, files=None, auto_id='id_%s', prefix=None, initial=None, error_class=<class 'django.forms.utils.ErrorList'>, label_suffix=None, empty_permitted=False, field_order=None, use_required_attribute=None, renderer=None, bound_field_class=None)[source]
Bases:
BaseFakeLoginFormFake login form with hidden honeypot field to detect bots.
- base_fields = {'hp': <django.forms.fields.CharField object>, 'password': <django.forms.fields.CharField object>, 'render_time': <django.forms.fields.CharField object>, 'username': <django.forms.fields.CharField object>}
- declared_fields = {'hp': <django.forms.fields.CharField object>, 'password': <django.forms.fields.CharField object>, 'render_time': <django.forms.fields.CharField object>, 'username': <django.forms.fields.CharField object>}
- property media
Return all media required to render the widgets on this form.
- class django_honeyguard.forms.FakeWordPressLoginForm(data=None, files=None, auto_id='id_%s', prefix=None, initial=None, error_class=<class 'django.forms.utils.ErrorList'>, label_suffix=None, empty_permitted=False, field_order=None, use_required_attribute=None, renderer=None, bound_field_class=None)[source]
Bases:
BaseFakeLoginFormFake WordPress login form with WordPress-specific attributes.
- username_required_message = 'The username field is empty.'
- password_required_message = 'The password field is empty.'
- base_fields = {'hp': <django.forms.fields.CharField object>, 'password': <django.forms.fields.CharField object>, 'render_time': <django.forms.fields.CharField object>, 'username': <django.forms.fields.CharField object>}
- declared_fields = {'hp': <django.forms.fields.CharField object>, 'password': <django.forms.fields.CharField object>, 'render_time': <django.forms.fields.CharField object>, 'username': <django.forms.fields.CharField object>}
- property media
Return all media required to render the widgets on this form.
Services
Business logic for HoneyGuard honeypot triggers.
Signals
honeypot_triggered Signal
Signal emitted when honeypot is triggered.
Arguments:
sender- The sender classrequest- Django HttpRequest objectdata- Dictionary with attack data including: *ip_address*path*username*password(sanitized) *honeypot_triggered*timing_issue*elapsed_time*risk_score
Example:
from django_honeyguard.signals import honeypot_triggered
from django.dispatch import receiver
@receiver(honeypot_triggered)
def my_handler(sender, request, data, **kwargs):
print(f"Attack from {data['ip_address']}")
Utilities
Utility functions for django-honeyguard.
- django_honeyguard.utils.get_client_ip(request: HttpRequest) str[source]
Extract the client’s IP address, honoring X-Forwarded-For if present.
- Parameters:
request – Django HttpRequest object
- Returns:
Client IP address
- Return type:
- django_honeyguard.utils.sanitize_password(password: str) str[source]
Sanitize password by replacing it with asterisks.
- django_honeyguard.utils.get_request_metadata(request: HttpRequest) Dict[str, str][source]
Collect request metadata for logging and alerting.
- Parameters:
request – Django HttpRequest object
- Returns:
Dictionary containing request metadata
- Return type:
- django_honeyguard.utils.check_timing_attack(render_time: str | None) Tuple[str, float][source]
Check if form submission timing is suspicious.
- Parameters:
render_time – ISO format created_at when form was rendered, or None
- Returns:
- (timing_issue, elapsed_time) where timing_issue is a TimingIssue choice
and elapsed_time is in seconds
- Return type:
Configuration
Configuration management for django-honeyguard.
- django_honeyguard.conf.validate_email_recipients(value: Any, setting_name: str) Tuple[List[str], str][source]
Validate EMAIL_RECIPIENTS setting.
- Parameters:
value – Setting value to validate
setting_name – Name of the setting
- Returns:
(validated_value, error_message)
- Return type:
- Raises:
ImproperlyConfigured – If value is invalid and cannot be fixed
- django_honeyguard.conf.validate_positive_number(value: Any, setting_name: str, min_value: float = 0.0) Tuple[float, str][source]
Validate a positive number setting.
- Parameters:
value – Setting value to validate
setting_name – Name of the setting
min_value – Minimum allowed value
- Returns:
(validated_value, error_message)
- Return type:
- Raises:
ImproperlyConfigured – If value is invalid
- django_honeyguard.conf.validate_positive_integer(value: Any, setting_name: str, min_value: int = 1) Tuple[int, str][source]
Validate a positive integer setting.
- Parameters:
value – Setting value to validate
setting_name – Name of the setting
min_value – Minimum allowed value
- Returns:
(validated_value, error_message)
- Return type:
- Raises:
ImproperlyConfigured – If value is invalid
- django_honeyguard.conf.validate_boolean(value: Any, setting_name: str) Tuple[bool, str][source]
Validate a boolean setting.
- Parameters:
value – Setting value to validate
setting_name – Name of the setting
- Returns:
(validated_value, error_message)
- Return type:
- django_honeyguard.conf.validate_log_level(value: Any, setting_name: str) Tuple[str, str][source]
Validate LOG_LEVEL setting.
- Parameters:
value – Setting value to validate
setting_name – Name of the setting
- Returns:
(validated_value, error_message)
- Return type:
- Raises:
ImproperlyConfigured – If value is invalid
- django_honeyguard.conf.validate_string(value: Any, setting_name: str) Tuple[str, str][source]
Validate a string setting.
- Parameters:
value – Setting value to validate
setting_name – Name of the setting
- Returns:
(validated_value, error_message)
- Return type:
- django_honeyguard.conf.validate_optional_string(value: Any, setting_name: str) Tuple[Any, str][source]
Validate an optional string setting (can be None or string).
- Parameters:
value – Setting value to validate
setting_name – Name of the setting
- Returns:
(validated_value, error_message)
- Return type:
- django_honeyguard.conf.validate_timing_fast(value: Any, setting_name: str) Tuple[float, str][source]
Validate TIMING_TOO_FAST_THRESHOLD.
- django_honeyguard.conf.validate_timing_slow(value: Any, setting_name: str) Tuple[float, str][source]
Validate TIMING_TOO_SLOW_THRESHOLD.
- django_honeyguard.conf.validate_username_length(value: Any, setting_name: str) Tuple[int, str][source]
Validate username length settings.
- class django_honeyguard.conf.Settings[source]
Settings management for django-honeyguard.
Allows settings to be configured either through: 1. A HONEYGUARD dictionary in Django settings 2. Individual HONEYGUARD_* settings
Settings are lazily loaded and cached for performance.
- __getattr__(name: str) Any[source]
Get a setting value by name.
- Parameters:
name – Setting name (without HONEYGUARD_ prefix)
- Returns:
Setting value from Django settings or default
- Raises:
AttributeError – If setting name is not valid
- change_setting(setting: str, value: Any, enter: bool, **kwargs: Any) None[source]
Handle Django setting changes via setting_changed signal.
- Parameters:
setting – Django setting name that changed
value – New value of the setting
enter – True if setting is being added/changed, False if removed
**kwargs – Additional signal arguments
Admin
Enhanced Django admin interface for HoneyGuard logs.
- class django_honeyguard.admin.HoneyGuardLogAdmin(model, admin_site)[source]
Enhanced admin interface for HoneyGuard logs.
- list_display = ('created_at', 'method', 'ip_address', 'path', 'username_display', 'risk_score_display', 'timing_issue', 'honeypot_triggered')
- list_filter = ('created_at', 'path', 'method', 'timing_issue', 'honeypot_triggered')
- search_fields = ('ip_address', 'username', 'password', 'user_agent', 'path', 'referer')
- date_hierarchy = 'created_at'
- readonly_fields = ('created_at', 'updated_at', 'risk_score_field', 'request_summary')
- list_per_page = 50
- ordering = ['-created_at']
- fieldsets = (('Request Information', {'fields': ('ip_address', 'path', 'method', 'created_at', 'updated_at')}), ('Authentication Attempt', {'fields': ('username', 'password')}), ('Detection Flags', {'classes': ('collapse',), 'fields': ('honeypot_triggered', 'timing_issue', 'elapsed_time', 'risk_score_field')}), ('Request Metadata', {'classes': ('collapse',), 'fields': ('user_agent', 'referer', 'accept_language', 'accept_encoding', 'request_summary', 'raw_metadata')}))
- actions = ['export_to_csv', 'archive_old_logs']
- username_display(obj: HoneyGuardLog) str[source]
Display username with truncation.
- risk_score_display(obj: HoneyGuardLog) str[source]
Display risk score with color coding.
- risk_score_field(obj: HoneyGuardLog) int[source]
Display risk score value for detail view.
- request_summary(obj: HoneyGuardLog) str[source]
Display formatted request summary.
- export_to_csv(request: Any, queryset: QuerySet) HttpResponse[source]
Export selected logs to CSV format.
- property media
Loggers
Logging utilities for django-honeyguard.
- class django_honeyguard.loggers.HoneyGuardLogger(name: str)[source]
Custom logger wrapper that respects HoneyGuard settings.
This logger checks ENABLE_CONSOLE_LOGGING before actually logging, and respects the configured LOG_LEVEL.
- django_honeyguard.loggers.get_logger(name: str) HoneyGuardLogger[source]
Get a HoneyGuard logger instance.
- Parameters:
name – Logger name (usually __name__)
- Returns:
Logger instance that respects HoneyGuard settings
- Return type: