erdewit / nest_asyncio

Patch asyncio to allow nested event loops
BSD 2-Clause "Simplified" License
693 stars 79 forks source link

How to share websocket context in quart? #86

Closed arpantechparticle closed 10 months ago

arpantechparticle commented 10 months ago

i have quart app with with websocket method.

charge_points = {}
@app.websocket("/ws/<charge_point_id>")
async def on_connect(charge_point_id: str):
    logging.info("charge_point_id: %s", charge_point_id)
    try:
       await websocket.accept()
        cp = SChargePoint(charge_point_id, websocket)
        charge_points[charge_point_id] = cp
    except asyncio.CancelledError:
        print('charger WebSocketDisconnect')
        logging.info("charger %s WebSocketDisconnect with code %s", charge_point_id, e.code)

Here SChargePoint which extended ChargePoint class.

class SChargePoint(ChargePoint):

    def __init__(self, charge_point_id, connection):
        super().__init__(charge_point_id, connection)
        self.order_id = None

    @on(Action.BootNotification)
    def on_boot_notification(
            self, charge_point_vendor: str, charge_point_model: str, **kwargs
    ):
        return call_result.BootNotificationPayload(
            current_time=datetime.utcnow().isoformat(),
            interval=55,
            status=RegistrationStatus.accepted,
        )

   async def remote_start_transaction(self, user, unit_rate, remote_start_item):
    #send message to connection.
}

ChargePoint class handle send, receive message of web socket.

when new connection is made i store it in charge_points. it store SChargePoint instance.

when need to send message to specific charger ponit id. i called

@app.post("/fleet/start-charging/<string:charge_point_id>")
async def remote_start(charge_point_id):
    remote_start_item = await request.get_json()
        schargepoint_instance = charge_points.get(charger_id)
    schargepoint_instance.remote_start_transaction(user, 21, remote_start_item)

it class remote_start_transaction method of SChargePoint class. SChargePoint already has websocket connection. but when it try to send message using send then get error ⇒ Not within a websocket context.