Source code for duck.http.middlewares

"""
Module for creating middlewares.

In production, please add the middleware `duck.http.middlewares.contrib.WWWRedirectMiddleware` to redirect 
traffic from www to non-www domain.
"""

from duck.http.request import HttpRequest
from duck.http.response import HttpBadRequestResponse, HttpResponse


[docs] class BaseMiddleware: """ Base middleware class. Usage: - You can set and access class-specific attributes directly (e.g., `Middleware.{attrib}`). - Each subclass manages its own attributes independently, similar to how instances work. Notes: - Make sure the middleware class names are different for them to behave independently. """ debug_message: str = "Middleware error" """ Debug error message which may be logged to the console for debugging purposes. """ request_ok: int = 1 """ Value to indicate if a request is in the correct format, has no errors, etc. """ request_bad: int = 0 """ Integer to indicate if request has any kind of issues or errors. """ _class_attrs = {}
[docs] @classmethod def __setattr__(cls, key, value): if not hasattr(cls, "_class_attrs"): cls._class_attrs = {} if cls not in cls._class_attrs: cls._class_attrs[cls] = {} cls._class_attrs[cls][key] = value
[docs] @classmethod def __getattr__(cls, key): if not hasattr(cls, "_class_attrs"): cls._class_attrs = {} if cls in cls._class_attrs and key in cls._class_attrs[cls]: return cls._class_attrs[cls][key] return getattr(type(cls), key, None)
[docs] @classmethod def get_error_response(cls, request: HttpRequest): """ Returns the error response when process_request returns `BaseMiddleware.request_bad`. """ error_response = HttpBadRequestResponse("Sorry there is an error in Request, that's all we know!") return error_response
[docs] @classmethod def process_request(cls, request: HttpRequest) -> int: """ Processes the incoming request. """ raise NotImplementedError(f"The method `process_request` must be implemented: {cls}")
[docs] @classmethod def process_response( cls, response: HttpResponse, request: HttpRequest, ) -> None: """ Processes the outgoing response. """ pass