Skip to content

Index

django_spire.core.middleware

__all__ = ['MaintenanceMiddleware', 'ProfilingMiddleware'] module-attribute

MaintenanceMiddleware

Source code in django_spire/core/middleware/maintenance.py
def __init__(self, get_response):
    self.get_response = get_response

get_response = get_response instance-attribute

__call__

Source code in django_spire/core/middleware/maintenance.py
def __call__(self, request: WSGIRequest):
    # maintenance_mode = getattr(settings, MAINTENANCE_MODE_SETTINGS_NAME)

    # if maintenance_mode is None:
    #     raise ValueError(f'"{MAINTENANCE_MODE_SETTINGS_NAME}" must be set in the django settings.')

    # if maintenance_mode:
    #     return TemplateResponse(
    #         request=request,
    #         template='django_spire/page/maintenance_page.html',
    #     )

    return self.get_response(request)

ProfilingMiddleware

Bases: MiddlewareMixin

Source code in django_spire/core/middleware/profiling.py
def __init__(self, get_response: Callable[[HttpRequest], HttpResponse]) -> None:
    super().__init__(get_response)

    if Profiler is None:
        message = 'pyinstrument is required for profiling.'
        raise ImportError(message)

    configuration = {
        'PROFILING_DIR': os.getenv('PROFILING_DIR', '.profile'),
        'PROFILING_ENABLED': os.getenv('PROFILING_ENABLED', 'False') == 'True',
    }

    directory = configuration.get('PROFILING_DIR', '.profile')

    if isinstance(directory, str):
        if not Path(directory).is_absolute():
            current = Path.cwd()
            base = getattr(settings, 'BASE_DIR', current)
            directory = Path(base) / directory
        else:
            directory = Path(directory)

    self.directory = Path(directory)
    self.directory.mkdir(exist_ok=True)

    self.enabled = configuration.get('PROFILING_ENABLED', False)
    self.profile_threshold = configuration.get('PROFILE_THRESHOLD', 0)

    self.count = 0
    self.lock = threading.Lock()

directory = Path(directory) instance-attribute

enabled = configuration.get('PROFILING_ENABLED', False) instance-attribute

profile_threshold = configuration.get('PROFILE_THRESHOLD', 0) instance-attribute

count = 0 instance-attribute

lock = threading.Lock() instance-attribute

process_view

Source code in django_spire/core/middleware/profiling.py
def process_view(
    self,
    request: HttpRequest,
    view_func: Callable[..., Any],
    args: tuple[Any, ...],
    kwargs: dict[str, Any]
) -> Any:
    if not settings.DEBUG:
        return None

    if not self.enabled:
        return None

    if self._should_skip_profiling(request):
        return None

    with self.lock:
        self.count = self.count + 1
        request._profiling_id = self.count

    profiler = Profiler(interval=0.001)
    start_time = time.time()
    profiler.start()

    try:
        response = view_func(request, *args, **kwargs)

        if hasattr(response, 'render'):
            response.render()
    except Exception:
        profiler.stop()
        duration_ms = (time.time() - start_time) * 1000
        self._save_profile(profiler, request, duration_ms)

        raise
    else:
        profiler.stop()
        duration_ms = (time.time() - start_time) * 1000

        if duration_ms >= self.profile_threshold:
            self._save_profile(profiler, request, duration_ms)

        return response