9
9
)
10
10
11
11
12
- class MiddlewareRegistry ( SingleInheritanceRequired [ "MiddlewareRegistry" ], ABC ) :
12
+ class MiddlewareRegistry :
13
13
"""
14
14
Middleware registry for managing all middlewares
15
15
@@ -31,20 +31,153 @@ class MiddlewareRegistry(SingleInheritanceRequired["MiddlewareRegistry"], ABC):
31
31
Response: route → MiddlewareA → MiddlewareB
32
32
This stacking behavior ensures that middlewares are executed in a predictable and controllable order.
33
33
"""
34
-
35
- @abstractmethod
34
+
35
+ def __init__ (self ):
36
+ """
37
+ Initialize the middleware registry.
38
+ """
39
+ self ._middlewares : list [Type [Middleware ]] = []
40
+
41
+ def add_middleware (self , middleware_class : Type [Middleware ]) -> None :
42
+ """
43
+ Add middleware to the end of the list.
44
+
45
+ Args:
46
+ middleware_class: The middleware class to add
47
+
48
+ Raises:
49
+ ValueError: If middleware is already registered
50
+ """
51
+ if middleware_class in self ._middlewares :
52
+ raise ValueError (f"Middleware { middleware_class .__name__ } is already registered" )
53
+ self ._middlewares .append (middleware_class )
54
+
55
+ def add_at_index (self , index : int , middleware_class : Type [Middleware ]) -> None :
56
+ """
57
+ Insert middleware at a specific index position.
58
+
59
+ Args:
60
+ index: The position to insert at (0-based)
61
+ middleware_class: The middleware class to add
62
+
63
+ Raises:
64
+ ValueError: If middleware is already registered or index is invalid
65
+ """
66
+ if middleware_class in self ._middlewares :
67
+ raise ValueError (f"Middleware { middleware_class .__name__ } is already registered" )
68
+ if index < 0 or index > len (self ._middlewares ):
69
+ raise ValueError (f"Index { index } is out of range (0-{ len (self ._middlewares )} )" )
70
+ self ._middlewares .insert (index , middleware_class )
71
+
72
+ def add_before (self , target_middleware : Type [Middleware ], middleware_class : Type [Middleware ]) -> None :
73
+ """
74
+ Insert middleware before the target middleware.
75
+
76
+ Args:
77
+ target_middleware: The middleware to insert before
78
+ middleware_class: The middleware class to add
79
+
80
+ Raises:
81
+ ValueError: If middleware is already registered or target not found
82
+ """
83
+ if middleware_class in self ._middlewares :
84
+ raise ValueError (f"Middleware { middleware_class .__name__ } is already registered" )
85
+ if target_middleware not in self ._middlewares :
86
+ raise ValueError (f"Target middleware { target_middleware .__name__ } not found" )
87
+ index = self ._middlewares .index (target_middleware )
88
+ self ._middlewares .insert (index , middleware_class )
89
+
90
+ def add_after (self , target_middleware : Type [Middleware ], middleware_class : Type [Middleware ]) -> None :
91
+ """
92
+ Insert middleware after the target middleware.
93
+
94
+ Args:
95
+ target_middleware: The middleware to insert after
96
+ middleware_class: The middleware class to add
97
+
98
+ Raises:
99
+ ValueError: If middleware is already registered or target not found
100
+ """
101
+ if middleware_class in self ._middlewares :
102
+ raise ValueError (f"Middleware { middleware_class .__name__ } is already registered" )
103
+ if target_middleware not in self ._middlewares :
104
+ raise ValueError (f"Target middleware { target_middleware .__name__ } not found" )
105
+ index = self ._middlewares .index (target_middleware )
106
+ self ._middlewares .insert (index + 1 , middleware_class )
107
+
108
+ def remove_middleware (self , middleware_class : Type [Middleware ]) -> None :
109
+ """
110
+ Remove a middleware from the registry.
111
+
112
+ Args:
113
+ middleware_class: The middleware class to remove
114
+
115
+ Raises:
116
+ ValueError: If middleware is not found
117
+ """
118
+ if middleware_class not in self ._middlewares :
119
+ raise ValueError (f"Middleware { middleware_class .__name__ } not found" )
120
+ self ._middlewares .remove (middleware_class )
121
+
122
+ def clear_middlewares (self ) -> None :
123
+ """Remove all middlewares from the registry."""
124
+ self ._middlewares .clear ()
125
+
126
+ def has_middleware (self , middleware_class : Type [Middleware ]) -> bool :
127
+ """
128
+ Check if a middleware is registered.
129
+
130
+ Args:
131
+ middleware_class: The middleware class to check
132
+
133
+ Returns:
134
+ bool: True if middleware is registered, False otherwise
135
+ """
136
+ return middleware_class in self ._middlewares
137
+
138
+ def get_middleware_count (self ) -> int :
139
+ """
140
+ Get the number of registered middlewares.
141
+
142
+ Returns:
143
+ int: Number of registered middlewares
144
+ """
145
+ return len (self ._middlewares )
146
+
147
+ def get_middleware_index (self , middleware_class : Type [Middleware ]) -> int :
148
+ """
149
+ Get the index of a middleware in the registry.
150
+
151
+ Args:
152
+ middleware_class: The middleware class to find
153
+
154
+ Returns:
155
+ int: The index of the middleware
156
+
157
+ Raises:
158
+ ValueError: If middleware is not found
159
+ """
160
+ if middleware_class not in self ._middlewares :
161
+ raise ValueError (f"Middleware { middleware_class .__name__ } not found" )
162
+ return self ._middlewares .index (middleware_class )
163
+
164
+
165
+
36
166
def get_middleware_classes (self ) -> list [Type [Middleware ]]:
37
167
"""
38
- Get all registered middleware classes
39
-
168
+ Get all registered middleware classes.
169
+
40
170
Returns:
41
- List[Type[Middleware]]: List of middleware classes
171
+ List[Type[Middleware]]: List of middleware classes in registration order
42
172
"""
43
- pass
44
-
173
+ return self . _middlewares . copy ()
174
+
45
175
def apply_middlewares (self , app : FastAPI ) -> FastAPI :
46
176
"""
47
- Apply middlewares to FastAPI application
177
+ Apply middlewares to FastAPI application.
178
+
179
+ Iterates through all registered middlewares and applies them to the FastAPI
180
+ application instance in the order they were registered.
48
181
49
182
Args:
50
183
app: FastAPI application instance
@@ -55,3 +188,16 @@ def apply_middlewares(self, app: FastAPI) -> FastAPI:
55
188
for middleware_class in self .get_middleware_classes ():
56
189
app .add_middleware (middleware_class )
57
190
return app
191
+
192
+
193
+
194
+ class MiddlewareConfiguration (SingleInheritanceRequired ["MiddlewareConfiguration" ]):
195
+ """
196
+ Middleware configuration for managing middleware registration and execution order.
197
+ """
198
+
199
+ def configure_middlewares (self , registry : MiddlewareRegistry ) -> None :
200
+ """
201
+ Setup middlewares for the registry.
202
+ """
203
+ pass
0 commit comments