I’m trying to leverage Ariadne (https://github.com/mirumee/ariadne) graphql project within Sanic to give myself some graphql endpoints. I’m able to get this to work just fine for a standard get/post endpoint within sanic; however, I’m having trouble with the websocket / subscription endpoint. Supposedly all you need an asgi server and websockets (both of which Sanic has), but I can’t figure out how to hook it up.
My normal process for websockets is:
@app.websocket("/ws/tasks")
@inject_user()
@scoped(
["auth:user", "auth:apitoken_user"], False
) # user or user-level api token are ok
async def ws_tasks(request, ws, user):
# open connection to db
# listen for updates from db and send them through ws
In other asgi applications, they’re able to do the following (from https://github.com/mirumee/ariadne/issues/320#issuecomment-722236333)
from ariadne.asgi import GraphQL
from starlette.routing import Route, WebSocketRoute
routers = [
Route("/graphql", GraphQL(schema=schema, debug=True)),
WebSocketRoute("/graphql", GraphQL(schema=schema, debug=True)),
]
app = Starlette(debug=True, routes=routers)
and essentially just plug it in. When I try to do something similar with Sanic (app.add_websocket_route(GraphQL(schema=schema, debug=True), "/graphql")
I get AttributeError: 'GraphQL' object has no attribute '__name__'