shaare.it

RuntimeError: Headers already sent

7 Dec 2025

1 min read

RuntimeError: Headers already sent

$ flask --app app.py run
Traceback (most recent call last):
  File "app.py", line 20, in stream
    response.headers['X-Late'] = '1'
RuntimeError: Headers already sent

Why this happens

Once Flask starts sending the response body to the client (especially with streaming), headers are finalized and cannot be changed. Trying to mutate headers after the first bytes are sent results in a RuntimeError.

Fix

Set headers before returning the response, or in before_request/after_request. For streaming, preconfigure headers on the response object you return.

Wrong code

from flask import Flask, Response
app = Flask(__name__)

@app.route('/stream')
def stream():
    def generate():
        yield 'chunk1\n'
        # Too late to set headers
        resp.headers['X-Late'] = '1'
        yield 'chunk2\n'
    resp = Response(generate(), mimetype='text/plain')
    return resp

Fixed code

from flask import Flask, Response
app = Flask(__name__)

@app.route('/stream')
def stream():
    def generate():
        yield 'chunk1\n'
        yield 'chunk2\n'
    resp = Response(generate(), mimetype='text/plain')
    resp.headers['X-Ready'] = '1'
    return resp

Tip

Avoid mutating headers in generators; instead, configure them on the Response before yielding.