django-nativemojo 0.1.10__py3-none-any.whl → 0.1.16__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- django_nativemojo-0.1.16.dist-info/METADATA +138 -0
- django_nativemojo-0.1.16.dist-info/RECORD +302 -0
- mojo/__init__.py +1 -1
- mojo/apps/account/management/__init__.py +5 -0
- mojo/apps/account/management/commands/__init__.py +6 -0
- mojo/apps/account/management/commands/serializer_admin.py +651 -0
- mojo/apps/account/migrations/0004_user_avatar.py +20 -0
- mojo/apps/account/migrations/0005_group_last_activity.py +18 -0
- mojo/apps/account/migrations/0006_add_device_tracking_models.py +72 -0
- mojo/apps/account/migrations/0007_delete_userdevicelocation.py +16 -0
- mojo/apps/account/migrations/0008_userdevicelocation.py +33 -0
- mojo/apps/account/migrations/0009_geolocatedip_subnet.py +18 -0
- mojo/apps/account/migrations/0010_group_avatar.py +20 -0
- mojo/apps/account/migrations/0011_user_org_registereddevice_pushconfig_and_more.py +118 -0
- mojo/apps/account/migrations/0012_remove_pushconfig_apns_key_file_and_more.py +21 -0
- mojo/apps/account/migrations/0013_pushconfig_test_mode_alter_pushconfig_apns_enabled_and_more.py +28 -0
- mojo/apps/account/migrations/0014_notificationdelivery_data_payload_and_more.py +48 -0
- mojo/apps/account/models/__init__.py +2 -0
- mojo/apps/account/models/device.py +281 -0
- mojo/apps/account/models/group.py +319 -15
- mojo/apps/account/models/member.py +29 -5
- mojo/apps/account/models/push/__init__.py +4 -0
- mojo/apps/account/models/push/config.py +112 -0
- mojo/apps/account/models/push/delivery.py +93 -0
- mojo/apps/account/models/push/device.py +66 -0
- mojo/apps/account/models/push/template.py +99 -0
- mojo/apps/account/models/user.py +369 -19
- mojo/apps/account/rest/__init__.py +2 -0
- mojo/apps/account/rest/device.py +39 -0
- mojo/apps/account/rest/group.py +9 -0
- mojo/apps/account/rest/push.py +187 -0
- mojo/apps/account/rest/user.py +100 -6
- mojo/apps/account/services/__init__.py +1 -0
- mojo/apps/account/services/push.py +363 -0
- mojo/apps/aws/migrations/0001_initial.py +206 -0
- mojo/apps/aws/migrations/0002_emaildomain_can_recv_emaildomain_can_send_and_more.py +28 -0
- mojo/apps/aws/migrations/0003_mailbox_is_domain_default_mailbox_is_system_default_and_more.py +31 -0
- mojo/apps/aws/migrations/0004_s3bucket.py +39 -0
- mojo/apps/aws/migrations/0005_alter_emaildomain_region_delete_s3bucket.py +21 -0
- mojo/apps/aws/models/__init__.py +19 -0
- mojo/apps/aws/models/email_attachment.py +99 -0
- mojo/apps/aws/models/email_domain.py +218 -0
- mojo/apps/aws/models/email_template.py +132 -0
- mojo/apps/aws/models/incoming_email.py +197 -0
- mojo/apps/aws/models/mailbox.py +288 -0
- mojo/apps/aws/models/sent_message.py +175 -0
- mojo/apps/aws/rest/__init__.py +7 -0
- mojo/apps/aws/rest/email.py +33 -0
- mojo/apps/aws/rest/email_ops.py +183 -0
- mojo/apps/aws/rest/messages.py +32 -0
- mojo/apps/aws/rest/s3.py +64 -0
- mojo/apps/aws/rest/send.py +101 -0
- mojo/apps/aws/rest/sns.py +403 -0
- mojo/apps/aws/rest/templates.py +19 -0
- mojo/apps/aws/services/__init__.py +32 -0
- mojo/apps/aws/services/email.py +390 -0
- mojo/apps/aws/services/email_ops.py +548 -0
- mojo/apps/docit/__init__.py +6 -0
- mojo/apps/docit/markdown_plugins/syntax_highlight.py +25 -0
- mojo/apps/docit/markdown_plugins/toc.py +12 -0
- mojo/apps/docit/migrations/0001_initial.py +113 -0
- mojo/apps/docit/migrations/0002_alter_book_modified_by_alter_page_modified_by.py +26 -0
- mojo/apps/docit/migrations/0003_alter_book_group.py +20 -0
- mojo/apps/docit/models/__init__.py +17 -0
- mojo/apps/docit/models/asset.py +231 -0
- mojo/apps/docit/models/book.py +227 -0
- mojo/apps/docit/models/page.py +319 -0
- mojo/apps/docit/models/page_revision.py +203 -0
- mojo/apps/docit/rest/__init__.py +10 -0
- mojo/apps/docit/rest/asset.py +17 -0
- mojo/apps/docit/rest/book.py +22 -0
- mojo/apps/docit/rest/page.py +22 -0
- mojo/apps/docit/rest/page_revision.py +17 -0
- mojo/apps/docit/services/__init__.py +11 -0
- mojo/apps/docit/services/docit.py +315 -0
- mojo/apps/docit/services/markdown.py +44 -0
- mojo/apps/fileman/README.md +8 -8
- mojo/apps/fileman/backends/base.py +76 -70
- mojo/apps/fileman/backends/filesystem.py +86 -86
- mojo/apps/fileman/backends/s3.py +409 -108
- mojo/apps/fileman/migrations/0001_initial.py +106 -0
- mojo/apps/fileman/migrations/0002_filemanager_parent_alter_filemanager_max_file_size.py +24 -0
- mojo/apps/fileman/migrations/0003_remove_file_fileman_fil_upload__c4bc35_idx_and_more.py +25 -0
- mojo/apps/fileman/migrations/0004_remove_file_original_filename_and_more.py +39 -0
- mojo/apps/fileman/migrations/0005_alter_file_upload_token.py +18 -0
- mojo/apps/fileman/migrations/0006_file_download_url_filemanager_forever_urls.py +23 -0
- mojo/apps/fileman/migrations/0007_remove_filemanager_forever_urls_and_more.py +22 -0
- mojo/apps/fileman/migrations/0008_file_category.py +18 -0
- mojo/apps/fileman/migrations/0009_rename_file_path_file_storage_file_path.py +18 -0
- mojo/apps/fileman/migrations/0010_filerendition.py +33 -0
- mojo/apps/fileman/migrations/0011_alter_filerendition_original_file.py +19 -0
- mojo/apps/fileman/models/__init__.py +1 -5
- mojo/apps/fileman/models/file.py +240 -58
- mojo/apps/fileman/models/manager.py +427 -31
- mojo/apps/fileman/models/rendition.py +118 -0
- mojo/apps/fileman/renderer/__init__.py +111 -0
- mojo/apps/fileman/renderer/audio.py +403 -0
- mojo/apps/fileman/renderer/base.py +205 -0
- mojo/apps/fileman/renderer/document.py +404 -0
- mojo/apps/fileman/renderer/image.py +222 -0
- mojo/apps/fileman/renderer/utils.py +297 -0
- mojo/apps/fileman/renderer/video.py +304 -0
- mojo/apps/fileman/rest/__init__.py +1 -18
- mojo/apps/fileman/rest/upload.py +22 -32
- mojo/apps/fileman/signals.py +58 -0
- mojo/apps/fileman/tasks.py +254 -0
- mojo/apps/fileman/utils/__init__.py +40 -16
- mojo/apps/incident/migrations/0005_incidenthistory.py +39 -0
- mojo/apps/incident/migrations/0006_alter_incident_state.py +18 -0
- mojo/apps/incident/migrations/0007_event_uid.py +18 -0
- mojo/apps/incident/migrations/0008_ticket_ticketnote.py +55 -0
- mojo/apps/incident/migrations/0009_incident_status.py +18 -0
- mojo/apps/incident/migrations/0010_event_country_code.py +18 -0
- mojo/apps/incident/migrations/0011_incident_country_code.py +18 -0
- mojo/apps/incident/migrations/0012_alter_incident_status.py +18 -0
- mojo/apps/incident/models/__init__.py +2 -0
- mojo/apps/incident/models/event.py +35 -0
- mojo/apps/incident/models/history.py +36 -0
- mojo/apps/incident/models/incident.py +3 -1
- mojo/apps/incident/models/ticket.py +62 -0
- mojo/apps/incident/reporter.py +21 -1
- mojo/apps/incident/rest/__init__.py +1 -0
- mojo/apps/incident/rest/event.py +7 -1
- mojo/apps/incident/rest/ticket.py +43 -0
- mojo/apps/jobs/__init__.py +489 -0
- mojo/apps/jobs/adapters.py +24 -0
- mojo/apps/jobs/cli.py +616 -0
- mojo/apps/jobs/daemon.py +370 -0
- mojo/apps/jobs/examples/sample_jobs.py +376 -0
- mojo/apps/jobs/examples/webhook_examples.py +203 -0
- mojo/apps/jobs/handlers/__init__.py +5 -0
- mojo/apps/jobs/handlers/webhook.py +317 -0
- mojo/apps/jobs/job_engine.py +734 -0
- mojo/apps/jobs/keys.py +203 -0
- mojo/apps/jobs/local_queue.py +363 -0
- mojo/apps/jobs/management/__init__.py +3 -0
- mojo/apps/jobs/management/commands/__init__.py +3 -0
- mojo/apps/jobs/manager.py +1327 -0
- mojo/apps/jobs/migrations/0001_initial.py +97 -0
- mojo/apps/jobs/migrations/0002_alter_job_max_retries_joblog.py +39 -0
- mojo/apps/jobs/models/__init__.py +6 -0
- mojo/apps/jobs/models/job.py +441 -0
- mojo/apps/jobs/rest/__init__.py +2 -0
- mojo/apps/jobs/rest/control.py +466 -0
- mojo/apps/jobs/rest/jobs.py +421 -0
- mojo/apps/jobs/scheduler.py +571 -0
- mojo/apps/jobs/services/__init__.py +6 -0
- mojo/apps/jobs/services/job_actions.py +465 -0
- mojo/apps/jobs/settings.py +209 -0
- mojo/apps/logit/migrations/0004_alter_log_level.py +18 -0
- mojo/apps/logit/models/log.py +7 -1
- mojo/apps/metrics/__init__.py +8 -1
- mojo/apps/metrics/redis_metrics.py +198 -0
- mojo/apps/metrics/rest/__init__.py +3 -0
- mojo/apps/metrics/rest/categories.py +266 -0
- mojo/apps/metrics/rest/helpers.py +48 -0
- mojo/apps/metrics/rest/permissions.py +99 -0
- mojo/apps/metrics/rest/values.py +277 -0
- mojo/apps/metrics/utils.py +19 -2
- mojo/decorators/auth.py +6 -1
- mojo/decorators/http.py +47 -3
- mojo/helpers/aws/__init__.py +45 -0
- mojo/helpers/aws/ec2.py +804 -0
- mojo/helpers/aws/iam.py +748 -0
- mojo/helpers/aws/inbound_email.py +309 -0
- mojo/helpers/aws/kms.py +413 -0
- mojo/helpers/aws/s3.py +451 -11
- mojo/helpers/aws/ses.py +483 -0
- mojo/helpers/aws/ses_domain.py +959 -0
- mojo/helpers/aws/sns.py +461 -0
- mojo/helpers/crypto/__init__.py +1 -1
- mojo/helpers/crypto/utils.py +15 -0
- mojo/helpers/dates.py +18 -0
- mojo/helpers/location/__init__.py +2 -0
- mojo/helpers/location/countries.py +262 -0
- mojo/helpers/location/geolocation.py +196 -0
- mojo/helpers/logit.py +37 -0
- mojo/helpers/redis/__init__.py +2 -0
- mojo/helpers/redis/adapter.py +606 -0
- mojo/helpers/redis/client.py +48 -0
- mojo/helpers/redis/pool.py +225 -0
- mojo/helpers/request.py +8 -0
- mojo/helpers/response.py +14 -2
- mojo/helpers/settings/__init__.py +2 -0
- mojo/helpers/{settings.py → settings/helper.py} +1 -37
- mojo/helpers/settings/parser.py +132 -0
- mojo/middleware/auth.py +1 -1
- mojo/middleware/cors.py +40 -0
- mojo/middleware/logging.py +131 -12
- mojo/middleware/mojo.py +10 -0
- mojo/models/rest.py +494 -65
- mojo/models/secrets.py +98 -3
- mojo/serializers/__init__.py +106 -0
- mojo/serializers/core/__init__.py +90 -0
- mojo/serializers/core/cache/__init__.py +121 -0
- mojo/serializers/core/cache/backends.py +518 -0
- mojo/serializers/core/cache/base.py +102 -0
- mojo/serializers/core/cache/disabled.py +181 -0
- mojo/serializers/core/cache/memory.py +287 -0
- mojo/serializers/core/cache/redis.py +533 -0
- mojo/serializers/core/cache/utils.py +454 -0
- mojo/serializers/core/manager.py +550 -0
- mojo/serializers/core/serializer.py +475 -0
- mojo/serializers/examples/settings.py +322 -0
- mojo/serializers/formats/csv.py +393 -0
- mojo/serializers/formats/localizers.py +509 -0
- mojo/serializers/{models.py → simple.py} +38 -15
- mojo/serializers/suggested_improvements.md +388 -0
- testit/client.py +1 -1
- testit/helpers.py +35 -4
- testit/runner.py +23 -6
- django_nativemojo-0.1.10.dist-info/METADATA +0 -96
- django_nativemojo-0.1.10.dist-info/RECORD +0 -194
- mojo/apps/metrics/rest/db.py +0 -0
- mojo/apps/notify/README.md +0 -91
- mojo/apps/notify/README_NOTIFICATIONS.md +0 -566
- mojo/apps/notify/admin.py +0 -52
- mojo/apps/notify/handlers/example_handlers.py +0 -516
- mojo/apps/notify/handlers/ses/__init__.py +0 -25
- mojo/apps/notify/handlers/ses/bounce.py +0 -0
- mojo/apps/notify/handlers/ses/complaint.py +0 -25
- mojo/apps/notify/handlers/ses/message.py +0 -86
- mojo/apps/notify/management/commands/__init__.py +0 -1
- mojo/apps/notify/management/commands/process_notifications.py +0 -370
- mojo/apps/notify/mod +0 -0
- mojo/apps/notify/models/__init__.py +0 -12
- mojo/apps/notify/models/account.py +0 -128
- mojo/apps/notify/models/attachment.py +0 -24
- mojo/apps/notify/models/bounce.py +0 -68
- mojo/apps/notify/models/complaint.py +0 -40
- mojo/apps/notify/models/inbox.py +0 -113
- mojo/apps/notify/models/inbox_message.py +0 -173
- mojo/apps/notify/models/outbox.py +0 -129
- mojo/apps/notify/models/outbox_message.py +0 -288
- mojo/apps/notify/models/template.py +0 -30
- mojo/apps/notify/providers/aws.py +0 -73
- mojo/apps/notify/rest/ses.py +0 -0
- mojo/apps/notify/utils/__init__.py +0 -2
- mojo/apps/notify/utils/notifications.py +0 -404
- mojo/apps/notify/utils/parsing.py +0 -202
- mojo/apps/notify/utils/render.py +0 -144
- mojo/apps/tasks/README.md +0 -118
- mojo/apps/tasks/__init__.py +0 -11
- mojo/apps/tasks/manager.py +0 -489
- mojo/apps/tasks/rest/__init__.py +0 -2
- mojo/apps/tasks/rest/hooks.py +0 -0
- mojo/apps/tasks/rest/tasks.py +0 -62
- mojo/apps/tasks/runner.py +0 -174
- mojo/apps/tasks/tq_handlers.py +0 -14
- mojo/helpers/aws/setup_email.py +0 -0
- mojo/helpers/redis.py +0 -10
- mojo/models/meta.py +0 -262
- mojo/ws4redis/README.md +0 -174
- mojo/ws4redis/__init__.py +0 -2
- mojo/ws4redis/client.py +0 -283
- mojo/ws4redis/connection.py +0 -327
- mojo/ws4redis/exceptions.py +0 -32
- mojo/ws4redis/redis.py +0 -183
- mojo/ws4redis/servers/base.py +0 -86
- mojo/ws4redis/servers/django.py +0 -171
- mojo/ws4redis/servers/uwsgi.py +0 -63
- mojo/ws4redis/settings.py +0 -45
- mojo/ws4redis/utf8validator.py +0 -128
- mojo/ws4redis/websocket.py +0 -403
- {django_nativemojo-0.1.10.dist-info → django_nativemojo-0.1.16.dist-info}/LICENSE +0 -0
- {django_nativemojo-0.1.10.dist-info → django_nativemojo-0.1.16.dist-info}/NOTICE +0 -0
- {django_nativemojo-0.1.10.dist-info → django_nativemojo-0.1.16.dist-info}/WHEEL +0 -0
- /mojo/apps/{notify → aws}/__init__.py +0 -0
- /mojo/apps/{notify/handlers → aws/migrations}/__init__.py +0 -0
- /mojo/apps/{notify/management → docit/markdown_plugins}/__init__.py +0 -0
- /mojo/apps/{notify/providers → docit/migrations}/__init__.py +0 -0
- /mojo/apps/{notify/rest → fileman/migrations}/__init__.py +0 -0
- /mojo/{ws4redis/servers → apps/jobs/examples}/__init__.py +0 -0
- /mojo/apps/{fileman/models/render.py → jobs/migrations/__init__.py} +0 -0
- /mojo/{serializers → rest}/openapi.py +0 -0
- /mojo/{apps/fileman/rest/__init__ → serializers/formats/__init__.py} +0 -0
mojo/middleware/logging.py
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
import json
|
2
|
+
import threading
|
3
|
+
from queue import Queue, Empty
|
1
4
|
from mojo.apps.logit.models import Log
|
2
5
|
from mojo.helpers.settings import settings
|
3
6
|
from mojo.helpers import logit
|
@@ -7,49 +10,165 @@ API_PREFIX = "/".join([settings.get("MOJO_PREFIX", "api/").rstrip("/"), ""])
|
|
7
10
|
LOGIT_DB_ALL = settings.get("LOGIT_DB_ALL", False)
|
8
11
|
LOGIT_FILE_ALL = settings.get("LOGIT_FILE_ALL", False)
|
9
12
|
LOGIT_RETURN_REAL_ERROR = settings.get("LOGIT_RETURN_REAL_ERROR", True)
|
13
|
+
LOGIT_MAX_RESPONSE_SIZE = settings.get("LOGIT_MAX_RESPONSE_SIZE", 1024) # 1KB default
|
10
14
|
LOGGER = logit.get_logger("requests", "requests.log")
|
11
15
|
ERROR_LOGGER = logit.get_logger("error", "error.log")
|
12
|
-
LOGIT_NO_LOG_PREFIX = settings.get("LOGIT_NO_LOG_PREFIX", [])
|
16
|
+
LOGIT_NO_LOG_PREFIX = settings.get("LOGIT_NO_LOG_PREFIX", ['GET:/api/user'])
|
17
|
+
LOGIT_ALWAYS_LOG_PREFIX = settings.get("LOGIT_ALWAYS_LOG_PREFIX", ['POST:/api/user', 'GET:/api/user/'])
|
18
|
+
|
19
|
+
# Async logging setup
|
20
|
+
log_queue = Queue()
|
21
|
+
background_thread = None
|
22
|
+
|
23
|
+
def background_logger():
|
24
|
+
"""Background thread to process logs without blocking responses."""
|
25
|
+
while True:
|
26
|
+
try:
|
27
|
+
log_item = log_queue.get(timeout=30) # 30s timeout
|
28
|
+
if log_item is None: # Shutdown signal
|
29
|
+
break
|
30
|
+
|
31
|
+
log_type, request, content, log_kind = log_item
|
32
|
+
|
33
|
+
if log_type == "db":
|
34
|
+
Log.logit(request, content, log_kind)
|
35
|
+
elif log_type == "file":
|
36
|
+
method = request.method if request else "SYSTEM"
|
37
|
+
ip = getattr(request, 'ip', 'unknown') if request else 'system'
|
38
|
+
path = getattr(request, 'path', 'unknown') if request else 'system'
|
39
|
+
LOGGER.info(f"{log_kind.upper()} - {method} - {ip} - {path}", content)
|
40
|
+
|
41
|
+
log_queue.task_done()
|
42
|
+
except Empty:
|
43
|
+
continue
|
44
|
+
except Exception as e:
|
45
|
+
ERROR_LOGGER.exception(f"Background logging error: {e}")
|
46
|
+
|
47
|
+
def start_background_logger():
|
48
|
+
global background_thread
|
49
|
+
if background_thread is None or not background_thread.is_alive():
|
50
|
+
background_thread = threading.Thread(target=background_logger, daemon=True)
|
51
|
+
background_thread.start()
|
52
|
+
|
53
|
+
# Start the background logger
|
54
|
+
start_background_logger()
|
13
55
|
|
14
56
|
class LoggerMiddleware:
|
15
57
|
def __init__(self, get_response):
|
16
58
|
self.get_response = get_response
|
17
59
|
|
60
|
+
def _request_matches_prefix(self, request, prefix):
|
61
|
+
"""
|
62
|
+
Checks if a request matches a given prefix rule.
|
63
|
+
The rule can be a simple path prefix or a "METHOD:/path/prefix".
|
64
|
+
"""
|
65
|
+
method = None
|
66
|
+
path_prefix = prefix
|
67
|
+
|
68
|
+
if ":" in prefix:
|
69
|
+
parts = prefix.split(":", 1)
|
70
|
+
# Ensure it's a valid METHOD:/path format
|
71
|
+
if len(parts) == 2 and parts[0].upper() in ('GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'):
|
72
|
+
method, path_prefix = parts[0].upper(), parts[1]
|
73
|
+
|
74
|
+
# Check if the path matches
|
75
|
+
if not request.path.startswith(path_prefix):
|
76
|
+
return False
|
77
|
+
|
78
|
+
# If a method was specified in the rule, check if it matches
|
79
|
+
if method and request.method != method:
|
80
|
+
return False
|
81
|
+
|
82
|
+
return True
|
83
|
+
|
18
84
|
def __call__(self, request):
|
19
|
-
# Log the request before calling get_response
|
20
85
|
self.log_request(request)
|
21
86
|
try:
|
22
87
|
response = self.get_response(request)
|
23
88
|
except Exception as e:
|
24
|
-
# Log or store the exception here
|
25
89
|
err = ERROR_LOGGER.exception()
|
26
|
-
Log.logit(request, err, "api_error")
|
90
|
+
Log.logit(request, err, "api_error") # Keep errors synchronous
|
27
91
|
error = "system error"
|
28
92
|
if LOGIT_RETURN_REAL_ERROR:
|
29
93
|
error = str(e)
|
30
94
|
response = JsonResponse(dict(status=False, error=error), status=500)
|
31
|
-
|
95
|
+
|
32
96
|
self.log_response(request, response)
|
33
97
|
return response
|
34
98
|
|
35
99
|
def can_log(self, request):
|
36
|
-
|
37
|
-
if
|
100
|
+
"""
|
101
|
+
Determines if a request should be logged based on settings.
|
102
|
+
- LOGIT_ALWAYS_LOG_PREFIX overrides LOGIT_NO_LOG_PREFIX.
|
103
|
+
- Rules can be "METHOD:/path/prefix" or "/path/prefix".
|
104
|
+
"""
|
105
|
+
# 1. Check LOGIT_ALWAYS_LOG_PREFIX first. If it matches, we must log.
|
106
|
+
for prefix in LOGIT_ALWAYS_LOG_PREFIX:
|
107
|
+
if self._request_matches_prefix(request, prefix):
|
108
|
+
return True
|
109
|
+
|
110
|
+
# 2. Check LOGIT_NO_LOG_PREFIX. If it matches, we must NOT log.
|
111
|
+
for prefix in LOGIT_NO_LOG_PREFIX:
|
112
|
+
if self._request_matches_prefix(request, prefix):
|
113
|
+
return False
|
114
|
+
|
115
|
+
# 3. Default behavior: log if no specific rules apply.
|
116
|
+
return True
|
117
|
+
|
118
|
+
def should_log_full_content(self, request, response):
|
119
|
+
"""Fast conditional checks to decide logging strategy."""
|
120
|
+
# Always log errors fully (but still async)
|
121
|
+
if response.status_code >= 400:
|
38
122
|
return True
|
39
|
-
|
123
|
+
|
124
|
+
# Quick size check
|
125
|
+
content_length = len(response.content)
|
126
|
+
if content_length > LOGIT_MAX_RESPONSE_SIZE:
|
127
|
+
return False
|
128
|
+
|
129
|
+
# Path-based decisions
|
130
|
+
if request.path.endswith('/list/') or '/list?' in request.path:
|
131
|
+
return False
|
132
|
+
|
133
|
+
return True
|
134
|
+
|
135
|
+
def get_response_log_content(self, request, response):
|
136
|
+
"""Extract log content - prioritize log_context if available."""
|
137
|
+
|
138
|
+
# Check for log_context first (fastest path)
|
139
|
+
if hasattr(response, 'log_context') and response.log_context:
|
140
|
+
return json.dumps(response.log_context)
|
141
|
+
|
142
|
+
# Conditional processing based on fast checks
|
143
|
+
if not self.should_log_full_content(request, response):
|
144
|
+
return f"Response: {response.status_code}, Size: {len(response.content)} bytes"
|
145
|
+
|
146
|
+
# For small responses, log full content
|
147
|
+
return response.content
|
148
|
+
|
149
|
+
def queue_log(self, log_type, request, content, log_kind):
|
150
|
+
"""Queue log for background processing."""
|
151
|
+
try:
|
152
|
+
log_queue.put((log_type, request, content, log_kind), block=False)
|
153
|
+
except:
|
154
|
+
# If queue is full, just skip this log to avoid blocking
|
155
|
+
pass
|
40
156
|
|
41
157
|
def log_request(self, request):
|
42
158
|
if not self.can_log(request):
|
43
159
|
return
|
44
160
|
if LOGIT_DB_ALL:
|
45
|
-
|
161
|
+
self.queue_log("db", request, request.DATA.to_json(as_string=True), "request")
|
46
162
|
if LOGIT_FILE_ALL:
|
47
|
-
|
163
|
+
self.queue_log("file", request, request._raw_body, "request")
|
48
164
|
|
49
165
|
def log_response(self, request, response):
|
50
166
|
if not self.can_log(request):
|
51
167
|
return
|
168
|
+
|
169
|
+
log_content = self.get_response_log_content(request, response)
|
170
|
+
|
52
171
|
if LOGIT_DB_ALL:
|
53
|
-
|
172
|
+
self.queue_log("db", request, log_content, "response")
|
54
173
|
if LOGIT_FILE_ALL:
|
55
|
-
|
174
|
+
self.queue_log("file", request, log_content, "response")
|
mojo/middleware/mojo.py
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
from mojo.helpers import request as rhelper
|
2
2
|
import time
|
3
3
|
from objict import objict
|
4
|
+
from mojo.helpers.settings import settings
|
5
|
+
from mojo.helpers import dates, logit
|
6
|
+
|
7
|
+
|
8
|
+
logger = logit.get_logger("debug", "debug.log")
|
4
9
|
|
5
10
|
ANONYMOUS_USER = objict(is_authenticated=False)
|
6
11
|
|
@@ -17,5 +22,10 @@ class MojoMiddleware:
|
|
17
22
|
request.ip = rhelper.get_remote_ip(request)
|
18
23
|
request.user_agent = rhelper.get_user_agent(request)
|
19
24
|
request.duid = rhelper.get_device_id(request)
|
25
|
+
# logger.info(f"duid: {request.duid}", request.META)
|
26
|
+
if settings.LOGIT_REQUEST_BODY:
|
27
|
+
request._raw_body = str(request.body)
|
28
|
+
else:
|
29
|
+
request._raw_body = None
|
20
30
|
request.DATA = rhelper.parse_request_data(request)
|
21
31
|
return self.get_response(request)
|