#2007·chalice

Question: Websocket connection in chalice local

Author: sreenathan-nairCreated Dec 10, 2022Updated Jun 23, 2025

I apologize if the question has already been asked before, I could not find anything substantial looking through the issues and docs. Is there a reference or minimal example which demonstrates how to connect to websocket when running chalice local?

Following is my setup, however I encounter errors when trying to connect to ws, only errors locally:

Enable and register websocket support and session

python
app = Chalice(app_name="testapp")
app.experimental_feature_flags.update(
    [
        "WEBSOCKETS",
    ]
)
app.websocket_api.session = boto3.Session()

# It doesn't get this far, but including below for completeness
@app.on_ws_message()
def _ws_message(event):
    return Response(
        {
            "message": "Success!",
        },
        status_code=200,
    )

Client code for connection

Working version (deployed)

python
url = "wss://####.execute-api.#####.amazonaws.com/api/"

async def connect():
    async with websockets.connect(
        url,
    ) as ws:
        print("Connected to the switch.")

if __name__ == "__main__":
    asyncio.run(connect())

Non-working version (chalice local)

python
url = "ws://localhost:8000/"

async def connect():
    async with websockets.connect(
        url,
    ) as ws:
        print("Connected to the switch.")

if __name__ == "__main__":
    asyncio.run(connect())

Error received for the above non-working version:

websockets.exceptions.InvalidStatusCode: server rejected WebSocket connection: HTTP 200

From what I understand, it looks like the connection does not get upgraded properly in local mode. It just hits the "/" http route and accepts the response which is just a {"message": "OK"} in this case.

If someone could point me in the right direction, that'd be great!

Thank you for your help!