|
5 | 5 | defaultdict, |
6 | 6 | ) |
7 | 7 | from inspect import ( |
8 | | - iscoroutinefunction, |
| 8 | + isawaitable, |
9 | 9 | ) |
10 | 10 | from typing import ( |
11 | 11 | Awaitable, |
@@ -112,34 +112,30 @@ def _build_one_class( |
112 | 112 |
|
113 | 113 | for name, decorators in mapping.items(): |
114 | 114 | for decorator in decorators: |
115 | | - ans[decorator].add(self._build_one_method(class_, name, decorator.pre_fn_name)) |
| 115 | + ans[decorator].add(self._build_one_method(class_, name, decorator.pre_fn_name, decorator.post_fn_name)) |
116 | 116 |
|
117 | 117 | @staticmethod |
118 | | - def _build_one_method(class_: type, name: str, pref_fn_name: str, **kwargs) -> Handler: |
| 118 | + def _build_one_method(class_: type, name: str, pref_fn_name: str, post_fn_name: str, **kwargs) -> Handler: |
119 | 119 | instance = class_(**kwargs) |
120 | 120 | fn = getattr(instance, name) |
121 | 121 | pre_fn = getattr(instance, pref_fn_name, None) |
| 122 | + post_fn = getattr(instance, post_fn_name, None) |
122 | 123 |
|
123 | | - if iscoroutinefunction(fn): |
124 | | - _awaitable_fn = fn |
125 | | - else: |
| 124 | + async def _wrapped_fn(request: Request) -> Optional[Response]: |
| 125 | + if pre_fn is not None: |
| 126 | + request = pre_fn(request) |
| 127 | + if isawaitable(request): |
| 128 | + request = await request |
126 | 129 |
|
127 | | - async def _awaitable_fn(request: Request) -> Optional[Response]: |
128 | | - return fn(request) |
| 130 | + response = fn(request) |
| 131 | + if isawaitable(response): |
| 132 | + response = await response |
129 | 133 |
|
130 | | - if pre_fn is None: |
131 | | - _wrapped_fn = _awaitable_fn |
132 | | - else: |
133 | | - if iscoroutinefunction(pre_fn): |
| 134 | + if post_fn is not None: |
| 135 | + response = post_fn(response) |
| 136 | + if isawaitable(response): |
| 137 | + response = await response |
134 | 138 |
|
135 | | - async def _wrapped_fn(request: Request) -> Optional[Response]: |
136 | | - request = await pre_fn(request) |
137 | | - return await _awaitable_fn(request) |
138 | | - |
139 | | - else: |
140 | | - |
141 | | - async def _wrapped_fn(request: Request) -> Optional[Response]: |
142 | | - request = pre_fn(request) |
143 | | - return await _awaitable_fn(request) |
| 139 | + return response |
144 | 140 |
|
145 | 141 | return _wrapped_fn |
0 commit comments