New in version 2.0
In the same way we saw for requests, Emmett also provides facilities to help you dealing with websockets in your application.
When a websocket connection comes from a client, Emmett binds useful informations about it within the
websocket object, which can be accessed just with an import:
from emmett import websocket
It contains useful information about the current processing socket, in particular:
|scheme||could be ws or wss|
|path||full path of the request|
|host||hostname of the request|
|headers||the headers of the request|
|cookies||the cookies passed with the request|
Now, let's see how to deal with request variables.
websocket object also shares the same attributes of
request when available:
|query_params||contains the URL query parameters|
and also in websockets, this attribute is an
sdict object so when the URL doesn't contain the query parameter you're trying to look at, this will be
None, so it's completely safe to call it. It won't raise any exception.
The main difference between request routes and websocket ones is the communication flow. In fact, while in standard routes you just write a return value, with sockets you can receive and send multiple messages within the same connection.
This is why the
websocket object in Emmett also has three awaitable methods for this purpose:
accept method is implicitly called by the former ones, and is exposed in case you want to specify a specific flow for websockets acceptance, the
send method will be used by Emmett to deal with communications.
Giving an example, a super simple echo websocket in Emmett will look like this:
from emmett import websocket @app.websocket() async def echo(): while True: message = await websocket.receive() await websocket.send(message)
Mind that, since a websocket route essentially is a loop, when your code returns Emmett will close the connection.