connexion icon indicating copy to clipboard operation
connexion copied to clipboard

Accessing request.state in manually routed function throws: RuntimeError: Working outside of operation context.

Open philippdieter opened this issue 2 months ago • 0 comments

I am new to connexion so I don't know if I just did not get something right or if it is actually a bug, so I hope someone can help me ether case.

Environment:

$ python -V
Python 3.13.7

$ pip freeze
a2wsgi==1.10.10
anyio==4.11.0
asgiref==3.10.0
attrs==25.4.0
blinker==1.9.0
certifi==2025.10.5
charset-normalizer==3.4.4
click==8.3.0
connexion==3.3.0
Flask==3.1.2
h11==0.16.0
httpcore==1.0.9
httptools==0.7.1
httpx==0.28.1
idna==3.11
inflection==0.5.1
itsdangerous==2.2.0
Jinja2==3.1.6
jsonschema==4.25.1
jsonschema-specifications==2025.9.1
MarkupSafe==3.0.3
python-dotenv==1.1.1
python-multipart==0.0.20
PyYAML==6.0.3
referencing==0.37.0
requests==2.32.5
rpds-py==0.28.0
sniffio==1.3.1
starlette==0.48.0
typing_extensions==4.15.0
urllib3==2.5.0
uvicorn==0.38.0
uvloop==0.22.1
watchfiles==1.1.1
websockets==15.0.1
Werkzeug==3.1.3

Example application:

import contextlib
from pathlib import Path
from connexion import FlaskApp, request

@contextlib.asynccontextmanager
async def lifespan_handler(app):
    print('run at start')
    foo = 'bar'
    yield {'foo': foo}
    print('run at shutdown')

app = FlaskApp(
    __name__,
    lifespan=lifespan_handler
    )

@app.route("/test")
async def route():
    foo = request.state.foo
    print(foo)
    return 'foobar'

if __name__ == "__main__":
    app.run(
        f"{Path(__file__).stem}:app",
        port=8080,
        )

So if I now access the /test endpoint i get the following exception:

RuntimeError("Working outside of operation context. Make sure your app is wrapped in a ContextMiddleware and you're processing a request while accessing the context.")
Traceback (most recent call last):

Full console output with traceback

Moving the same function to its own class and have it accessed by an resolver works just fine. So is there a problem or can this just not work?

philippdieter avatar Oct 24 '25 14:10 philippdieter