Client#

Why does the client close the connection prematurely?#

You’re exiting the context manager prematurely. Wait for the work to be finished before exiting.

For example, if your code has a structure similar to:

async with connect(...) as websocket:
    asyncio.create_task(do_some_work())

change it to:

async with connect(...) as websocket:
    await do_some_work()

How do I access HTTP headers?#

Once the connection is established, HTTP headers are available in request_headers and response_headers.

How do I set HTTP headers?#

To set the Origin, Sec-WebSocket-Extensions, or Sec-WebSocket-Protocol headers in the WebSocket handshake request, use the origin, extensions, or subprotocols arguments of connect().

To override the User-Agent header, use the user_agent_header argument. Set it to None to remove the header.

To set other HTTP headers, for example the Authorization header, use the extra_headers argument:

async with connect(..., extra_headers={"Authorization": ...}) as websocket:
    ...

In the threading API, this argument is named additional_headers:

with connect(..., additional_headers={"Authorization": ...}) as websocket:
    ...

How do I close a connection?#

The easiest is to use connect() as a context manager:

async with connect(...) as websocket:
    ...

The connection is closed when exiting the context manager.

How do I reconnect when the connection drops?#

Use connect() as an asynchronous iterator:

async for websocket in websockets.connect(...):
    try:
        ...
    except websockets.ConnectionClosed:
        continue

Make sure you handle exceptions in the async for loop. Uncaught exceptions will break out of the loop.

How do I stop a client that is processing messages in a loop?#

You can close the connection.

Here’s an example that terminates cleanly when it receives SIGTERM on Unix:

#!/usr/bin/env python

import asyncio
import signal
import websockets

async def client():
    uri = "ws://localhost:8765"
    async with websockets.connect(uri) as websocket:
        # Close the connection when receiving SIGTERM.
        loop = asyncio.get_running_loop()
        loop.add_signal_handler(
            signal.SIGTERM, loop.create_task, websocket.close())

        # Process messages received on the connection.
        async for message in websocket:
            ...

asyncio.run(client())

How do I disable TLS/SSL certificate verification?#

Look at the ssl argument of create_connection().

connect() accepts the same arguments as create_connection().