def process_response(self, request, response): """ If there was a write to the db, set the session variable to enable pinning. If the variable already exists, the time will be reset. """ if pinning.db_was_written(): pinned_until = datetime.now() + timedelta(seconds=PINNING_SECONDS) request.session[PINNING_KEY] = pinned_until pinning.clear_db_write() pinning.unpin_thread() return response
def process_response(self, request, response): """ If this is a POST request and there was a write to the db, set the cookie to enable pinning. If the cookie already exists, the time will be reset. """ if request.method == 'POST' and pinning.db_was_written(): response.set_cookie(PINNING_KEY, value='y', max_age=PINNING_SECONDS) pinning.clear_db_write() pinning.unpin_thread() return response
def test_middleware(self): for middleware, vehicle in [(PinningSessionMiddleware(), 'session'), (PinningCookieMiddleware(), 'cookie')]: # The first request shouldn't pin the database middleware.process_request(self.mock_request) self.assertFalse(pinning.thread_is_pinned()) # A simulated write also shouldn't, if the request isn't a POST pinning.set_db_write() middleware.process_request(self.mock_request) self.assertFalse(pinning.thread_is_pinned()) # This response should set the session variable and clear the pin pinning.set_db_write() self.mock_request.method = 'POST' response = middleware.process_response(self.mock_request, self.mock_response) self.assertFalse(pinning.thread_is_pinned()) self.assertFalse(pinning.db_was_written()) if vehicle == 'session': self.assertTrue( self.mock_request.session.get(PINNING_KEY, False) ) else: self.assertEqual(response.cookie, PINNING_KEY) self.mock_request.COOKIES = [response.cookie] # The subsequent request should then pin the database middleware.process_request(self.mock_request) self.assertTrue(pinning.thread_is_pinned()) pinning.unpin_thread() if vehicle == 'session': # After the pinning period has expired, the request should no # longer pin the thread exp = timedelta(seconds=PINNING_SECONDS - 5) self.mock_request.session[PINNING_KEY] = datetime.now() - exp middleware.process_request(self.mock_request) self.assertFalse(pinning.thread_is_pinned()) pinning.unpin_thread()