Tina4

Middleware {#declare}#

๐Ÿ”ฅ Hot Tips

  • Middleware classes modify requests/responses before or after route handling.
  • Use for authentication, CORS, logging, or content manipulation.
  • Method names follow conventions: before_, after_, or before_and_after_ prefixes.
  • Return modified (request, response) tuples from methods.
:::

Defining a Middleware Class#

Create a class with static methods for events. Prefixes determine when they fire.

python
# src/app/middleware.py (or any file, import accordingly)โ€‹class MiddleWare:    @staticmethod    def before_route(request, response):        response.headers['Tina4-Control-Allow-Origin-Before'] = '*'        response.content = "Before"  # Initialize or modify content        return request, responseโ€‹    @staticmethod    def before_something_else(request, response):        response.headers['Tina4-Control-Allow-Origin-Before-Something-Else'] = '*'        response.content = "Before Something Else"        return request, responseโ€‹    @staticmethod    def after_route(request, response):        response.headers['Tina4-Control-Allow-Origin-After'] = '*'        response.content += " After"        return request, responseโ€‹    @staticmethod    def some_other(request, response):        response.content += " Some Other"        return request, response        @staticmethod    def before_and_after_route(request, response):        response.headers['Tina4-Control-Allow-Origin-BEFORE_AFTER'] = '*'        response.content += " Before and After"        return request, response
  • Methods run based on prefixes: before_ before route, after_ after, before_and_after_ both.
  • Useful for headers (e.g., CORS), authentication, or content changes.

Attaching Middleware to Routes {#routes}#

Import and apply @middleware decorator before route decorators. Fires all matching methods by default.

python
# src/routes/example.py (include in src/__init__.py)โ€‹from tina4_python.Router import get, middlewarefrom src.app.middleware import MiddleWare  # Adjust import pathโ€‹# All methods fire based on naming@middleware(MiddleWare)@get("/test/redirect")async def redirect(request, response):    return response.redirect("/hello/world")โ€‹# Specify events to fire@middleware(MiddleWare, ["some_other"])@get("/system/roles/data")async def system_roles(request, response):    print("roles")    return response("OK")
  • @middleware(ClassName): Applies to the route.
  • Optional list: Limits to specific methods (e.g., ["before_route", "after_route"]).
  • Multiple middlewares stackable by adding more @middleware decorators.