{"id":13557479,"url":"https://github.com/graphql-python/graphene-tornado","last_synced_at":"2025-07-20T01:34:26.025Z","repository":{"id":47119518,"uuid":"104596670","full_name":"graphql-python/graphene-tornado","owner":"graphql-python","description":null,"archived":false,"fork":false,"pushed_at":"2024-03-20T15:32:52.000Z","size":203,"stargazers_count":52,"open_issues_count":3,"forks_count":12,"subscribers_count":31,"default_branch":"master","last_synced_at":"2025-07-13T00:41:17.027Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/graphql-python.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-09-23T20:22:08.000Z","updated_at":"2023-11-05T16:33:04.000Z","dependencies_parsed_at":"2024-06-19T05:15:38.232Z","dependency_job_id":"5f9fc42f-7f24-46aa-987a-b392ccc282aa","html_url":"https://github.com/graphql-python/graphene-tornado","commit_stats":{"total_commits":47,"total_committers":9,"mean_commits":5.222222222222222,"dds":0.2978723404255319,"last_synced_commit":"e4fa7d7b4c2256fa37f5ad89cbfd4d4bf6fdb606"},"previous_names":[],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/graphql-python/graphene-tornado","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/graphql-python%2Fgraphene-tornado","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/graphql-python%2Fgraphene-tornado/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/graphql-python%2Fgraphene-tornado/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/graphql-python%2Fgraphene-tornado/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/graphql-python","download_url":"https://codeload.github.com/graphql-python/graphene-tornado/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/graphql-python%2Fgraphene-tornado/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266053860,"owners_count":23869499,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-01T12:04:22.681Z","updated_at":"2025-07-20T01:34:26.003Z","avatar_url":"https://github.com/graphql-python.png","language":"Python","funding_links":[],"categories":["Python","others"],"sub_categories":[],"readme":"[![Build Status](https://travis-ci.org/graphql-python/graphene-tornado.svg?branch=master)](https://travis-ci.org/graphql-python/graphene-tornado) \n[![Coverage Status](https://coveralls.io/repos/github/graphql-python/graphene-tornado/badge.svg?branch=master)](https://coveralls.io/github/graphql-python/graphene-tornado?branch=master)\n\n# graphene-tornado\n\nA project for running [Graphene](http://graphene-python.org/) on top of [Tornado](http://www.tornadoweb.org/) for Python 3. The codebase was originally a port of [graphene-django](https://github.com/graphql-python/graphene-django).\n\n# Getting started\n\nCreate a Tornado application and add the GraphQL handlers:\n\n```python\nimport tornado.web\nfrom tornado.ioloop import IOLoop\n\nfrom graphene_tornado.schema import schema\nfrom graphene_tornado.tornado_graphql_handler import TornadoGraphQLHandler\n\n\nclass ExampleApplication(tornado.web.Application):\n\n    def __init__(self):\n        handlers = [\n            (r'/graphql', TornadoGraphQLHandler, dict(graphiql=True, schema=schema)),\n            (r'/graphql/batch', TornadoGraphQLHandler, dict(graphiql=True, schema=schema, batch=True)),\n            (r'/graphql/graphiql', TornadoGraphQLHandler, dict(graphiql=True, schema=schema))\n        ]\n        tornado.web.Application.__init__(self, handlers)\n\nif __name__ == '__main__':\n    app = ExampleApplication()\n    app.listen(5000)\n    IOLoop.instance().start()\n```\n\nWhen writing your resolvers, decorate them with either Tornado's `@coroutine` decorator for Python 2.7:\n\n```python\n@gen.coroutine\ndef resolve_foo(self, info):\n  foo = yield db.get_foo()\n  raise Return(foo)\n```\n\nOr use the `async` / `await` pattern in Python 3:\n\n```python\nasync def resolve_foo(self, info):\n  foo = await db.get_foo()\n  return foo\n```\n\n# Extensions\n\n`graphene-tornado` supports server-side extensions like [Apollo Server](https://www.apollographql.com/docs/apollo-server/features/metrics). The extensions go a step further than Graphene middleware to allow for finer grained interception of request processing. The canonical use case is for tracing; see `graphene_tornado/apollo_engine_reporting/engine_agent.py` for an example.\n\nExtensions are experimental and most likely will change in future releases as they should be extensions provided by \n`graphql-server-core`.\n\n## Apollo Engine Reporting\n\nYou can integrate with Apollo Engine Reporting by enabling the extension.\n\n```console\n$ pip install graphene-tornado[apollo-engine-reporting]\n```\n\n```python\nengine_options = EngineReportingOptions()\nagent = EngineReportingAgent(engine_options, generate_schema_hash(schema))\n\n\nclass ExampleEngineReportingApplication(tornado.web.Application):\n\n    def __init__(self):\n        engine_extension = lambda: EngineReportingExtension(engine_options, agent.add_trace)\n        handlers = [\n            (r'/graphql', TornadoGraphQLHandler, dict(graphiql=True, schema=schema, extensions=[engine_extension])),\n            (r'/graphql/batch', TornadoGraphQLHandler, dict(graphiql=True, schema=schema, batch=True, \n                                                            extensions=[engine_extension])),\n            (r'/graphql/graphiql', TornadoGraphQLHandler, dict(graphiql=True, schema=schema, \n                                                               extensions=[engine_extension]))\n        ]\n        tornado.web.Application.__init__(self, handlers)\n```\n\n\n```console\nENGINE_API_KEY=\u003cyour engine API key here\u003e python -m examples.apollo_engine_reporting_example\n```\n\nThen visit `http://localhost:5000/graphql/graphiql`, make some queries, and view the results in Apollo Engine.\n\n## OpenCensus\n\nYou can also use [OpenCensus](https://github.com/census-instrumentation/opencensus-python) for tracing:\n\n```console\n$ pip install graphene-tornado[opencensus]\n```\n\n\n```python\nclass ExampleOpenCensusApplication(tornado.web.Application):\n\n    def __init__(self):\n        extension = lambda: OpenCensusExtension()\n        handlers = [\n            (r'/graphql', TornadoGraphQLHandler, dict(graphiql=True, schema=schema, extensions=[extension])),\n            (r'/graphql/batch', TornadoGraphQLHandler, dict(graphiql=True, schema=schema, batch=True)),\n        ]\n        tornado.web.Application.__init__(self, handlers)\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgraphql-python%2Fgraphene-tornado","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgraphql-python%2Fgraphene-tornado","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgraphql-python%2Fgraphene-tornado/lists"}