Skip to content

Commit ce68a39

Browse files
izabala033ikmersia
andauthored
Adapt _process_response for runtime database selection (#827)
* use with context at runtime * add comment explaining why context manager is better in this case --------- Co-authored-by: Iker Zabala <iker.zabala@immersia.eu>
1 parent 6020605 commit ce68a39

File tree

1 file changed

+23
-21
lines changed

1 file changed

+23
-21
lines changed

silk/middleware.py

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -143,29 +143,31 @@ def process_request(self, request):
143143
request_model = RequestModelFactory(request).construct_request_model()
144144
DataCollector().configure(request_model, should_profile=should_profile)
145145

146-
@transaction.atomic(using=router.db_for_write(models.SQLQuery))
147146
def _process_response(self, request, response):
148-
Logger.debug('Process response')
149-
with silk_meta_profiler():
150-
collector = DataCollector()
151-
collector.stop_python_profiler()
152-
silk_request = collector.request
147+
# Use a context manager instead of a decorator so db_for_write is evaluated at runtime,
148+
# which is important for dynamic database configurations (e.g., multitenancy).
149+
with transaction.atomic(using=router.db_for_write(models.SQLQuery)):
150+
Logger.debug('Process response')
151+
with silk_meta_profiler():
152+
collector = DataCollector()
153+
collector.stop_python_profiler()
154+
silk_request = collector.request
155+
if silk_request:
156+
ResponseModelFactory(response).construct_response_model()
157+
silk_request.end_time = timezone.now()
158+
collector.finalise()
159+
else:
160+
Logger.error(
161+
'No request model was available when processing response. '
162+
'Did something go wrong in process_request/process_view?'
163+
'\n' + str(request) + '\n\n' + str(response)
164+
)
165+
# Need to save the data outside the silk_meta_profiler
166+
# Otherwise the meta time collected in the context manager
167+
# is not taken in account
153168
if silk_request:
154-
ResponseModelFactory(response).construct_response_model()
155-
silk_request.end_time = timezone.now()
156-
collector.finalise()
157-
else:
158-
Logger.error(
159-
'No request model was available when processing response. '
160-
'Did something go wrong in process_request/process_view?'
161-
'\n' + str(request) + '\n\n' + str(response)
162-
)
163-
# Need to save the data outside the silk_meta_profiler
164-
# Otherwise the meta time collected in the context manager
165-
# is not taken in account
166-
if silk_request:
167-
silk_request.save()
168-
Logger.debug('Process response done.')
169+
silk_request.save()
170+
Logger.debug('Process response done.')
169171

170172
def process_response(self, request, response):
171173
max_attempts = 2

0 commit comments

Comments
 (0)