出现此问题的原因是因为在Ariadne中的相应代码行中对象没有被正确调用。为了解决此问题,您可以尝试使用以下代码示例中所示的方法调用对象:
from starlette.applications import Starlette
from starlette.routing import Route
from starlette.websockets import WebSocketDisconnect
from ariadne.asgi import GraphQL
from ariadne import SubscriptionType, make_executable_schema
type_defs = """
type Query {
hello: String!
}
type Subscription {
increment: Int!
}
"""
subscription = SubscriptionType()
@subscription.source("increment")
async def subscribe_increment_event_generator(obj, info):
i = 0
while True:
i += 1
yield i
await asyncio.sleep(1)
def increment_resolver(obj, info):
return obj
schema = make_executable_schema(type_defs, subscription)
async def hello_resolver(obj, info):
return "Hello, world!"
query = {
"hello": hello_resolver
}
app = Starlette(
routes=[
Route("/", GraphQL(schema=schema, query=query, subscription=subscription))
]
)
if __name__ == '__main__':
uvicorn.run(app, host="0.0.0.0", port=8000)
在此示例中,我们使用一个名为subscription
(订阅)的对象,并将其添加到可执行架构中。我们还创建一个名为subscribe_increment_event_generator
的订阅源,该源不断地生成增量并将其提供给客户端。然后,我们使用名为increment_resolver
的解析器方法来返回增量值。最后,我们创建一个名为app
的Starlette应用程序,并将GraphQL WebSocket处理程序绑定到该应用程序上。