Slow exports, email batches and external API work should not depend on a browser connection remaining open. A durable queue and worker provide clearer completion and retry behavior.
IN THIS ARTICLE
What you need before you begin
Confirm a queue backend and supervised background processes are available. Decide how each job is identified and whether repeating it could create a duplicate external action.
01 Separate Flask background tasks from web requests
Move the slow operation into a task handler with explicit inputs. Store the job record and required data rather than passing an entire live request object.
Submit the task after the application has safely recorded the request. Return a job identifier and a status view instead of making the browser wait for all work.
Configure the worker with the production application context and secrets required by the task. Use the supported integration for the chosen queue library.
Set timeouts, retry limits and duplicate protection. Separate a temporary provider failure from a permanent validation error.
Monitor completion and failures, and restart workers as part of deployment so they load the new application code.
Confirm the expected result
Submit a test job, close the browser and confirm it still completes. Verify a failed job can be investigated without exposing customer content.
Troubleshoot unexpected results
Starting an untracked thread inside a request is not a durable replacement for a worker. Process recycling or an application restart can end that work unexpectedly.
A common question
Can I retry every failed task automatically?
Only when the task is designed for it. A timeout may occur after an external action succeeded, so use identifiers and status reconciliation before repeating payments, messages or provisioning.