11import re
22from pathlib import Path
3- from typing import Any
43
54import marshmallow
65from flask import Flask
76from flask import Request
87from flask import request
98from flask import Response
109from marshmallow .exceptions import ValidationError
11- from werkzeug .datastructures import Headers
1210from werkzeug .datastructures import MultiDict
1311
1412from .first import RequestSerializer
@@ -77,30 +75,27 @@ def _route_registration_in_flask(self, func: callable) -> None:
7775
7876 self ._mapped_routes_from_spec .append (rule )
7977
80- def _extract_data_from_request (
81- self , request_obj : Request
82- ) -> tuple [Any , str or None , Headers , dict [str , Any ] or None , dict , dict , Any or None ]:
83- method = request_obj .method .lower ()
78+ @staticmethod
79+ def _extract_method_from_request (request_obj : Request ) -> str :
80+ return request_obj .method .lower ()
8481
82+ @staticmethod
83+ def _extract_route_from_request (request_obj : Request ) -> str :
8584 if request_obj .url_rule is not None :
8685 route = request_obj .url_rule .rule
8786 else :
8887 route = request_obj .url_rule
8988
90- headers = request_obj .headers
91-
92- view_args = request_obj .view_args
93-
94- args = self ._resolved_params (request_obj .args )
95-
96- cookies = self ._resolved_params (request_obj .cookies )
89+ return route
9790
91+ @staticmethod
92+ def _extract_json_from_request (request_obj : Request ) -> dict or None :
9893 if request_obj .is_json :
9994 json = request_obj .get_json ()
10095 else :
10196 json = None
10297
103- return method , route , headers , view_args , args , cookies , json
98+ return json
10499
105100 @staticmethod
106101 def _resolved_params (payload : MultiDict ) -> dict :
@@ -139,31 +134,29 @@ def add_request_validating() -> None:
139134 if request .method in ('OPTIONS' ,):
140135 return
141136
142- (
143- method ,
144- route ,
145- headers ,
146- view_args ,
147- args ,
148- cookies ,
149- json ,
150- ) = self ._extract_data_from_request (request )
151-
137+ route = self ._extract_route_from_request (request )
152138 if route not in self ._mapped_routes_from_spec :
153139 return
154140
155141 route_as_in_spec = self .route_to_openapi_format (route )
156142
143+ method = self ._extract_method_from_request (request )
157144 params_schemas = self .spec .serialized_spec ['paths' ][route_as_in_spec ][method ].get (
158145 'parameters'
159146 )
147+ args = self ._resolved_params (request .args )
160148 if params_schemas :
161149 args_schema = params_schemas .get ('args' )
162150 if args_schema :
163151 schema_fields = args_schema ().fields
164152 args = self ._arg_to_list (args , schema_fields )
165153
166- rv = RequestSerializer (
154+ headers = request .headers
155+ view_args = request .view_args
156+ cookies = self ._resolved_params (request .cookies )
157+ json = self ._extract_json_from_request (request )
158+
159+ request_serializer = RequestSerializer (
167160 self .spec ,
168161 method ,
169162 route_as_in_spec ,
@@ -173,20 +166,22 @@ def add_request_validating() -> None:
173166 params = args ,
174167 json = json ,
175168 )
176- rv .validate ()
177-
178- request .first_headers = rv .serialized_headers
179- request .first_view_args = rv .serialized_path_params
180- request .first_args = rv .serialized_params
181- request .first_cookies = rv .serialized_cookies
182- request .first_json = rv .serialized_json
169+ request_serializer .validate ()
170+
171+ request .extensions = {
172+ 'first' : {
173+ 'headers' : request_serializer .serialized_headers ,
174+ 'view_args' : request_serializer .serialized_path_params ,
175+ 'args' : request_serializer .serialized_params ,
176+ 'cookies' : request_serializer .serialized_cookies ,
177+ 'json' : request_serializer .serialized_json ,
178+ }
179+ }
183180
184181 def _register_response_validation (self ) -> None :
185182 @self .app .after_request
186183 def add_response_validating (response : Response ) -> Response :
187- method , route , _ , _ , _ , _ , json = self ._extract_data_from_request (request )
188- json = response .get_json ()
189-
184+ route = self ._extract_route_from_request (request )
190185 if route not in self ._mapped_routes_from_spec :
191186 return response
192187
@@ -199,6 +194,7 @@ def add_response_validating(response: Response) -> Response:
199194 f'Route <{ e .args [0 ]} > not defined in specification.'
200195 )
201196
197+ method = self ._extract_method_from_request (request )
202198 try :
203199 method_schema : dict = route_schema [method ]
204200 except KeyError as e :
@@ -226,6 +222,7 @@ def add_response_validating(response: Response) -> Response:
226222 )
227223
228224 if response_content_type == 'application/json' :
225+ json = response .get_json ()
229226 json_schema = content [response .content_type ]['schema' ]
230227 try :
231228 if isinstance (json , list ):
0 commit comments