Integrations#

You can dive into full examples in the examples folder.

Flask#

from flask import Flask, request, jsonify

from hiku.graph import Graph, Root, Field
from hiku.types import String
from hiku.engine import Engine
from hiku.executors.sync import SyncExecutor
from hiku.endpoint.graphql import GraphQLEndpoint

app = Flask(__name__)

redis = Redis()

def say_hello(fields):
    return ['Hello World!' for _ in fields]

QUERY_GRAPH = Graph([
    Root([Field('hello', String, say_hello)]),
])

graphql_endpoint = GraphQLEndpoint(
    Engine(SyncExecutor()), QUERY_GRAPH
)

@app.route('/graphql', methods={'POST'})
def graphql():
    data = request.get_json()
    context = {'redis': redis}
    result = graphql_endpoint.dispatch(data, context)
    return jsonify(result)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

Aiohttp#

from aiohttp import web

from hiku.types import String
from hiku.graph import Graph, Root, Field
from hiku.engine import Engine
from hiku.endpoint.graphql import AsyncGraphQLEndpoint
from hiku.executors.asyncio import AsyncIOExecutor


def say_hello(fields):
    return ['Hello World!' for _ in fields]


QUERY_GRAPH = Graph([
    Root([Field('hello', String, say_hello)]),
])


async def handle_graphql(request):
    data = await request.json()
    context = {
        'redis': request.app['redis'],
    }
    result = await request.app['graphql-endpoint'].dispatch(data, context)
    return web.json_response(result)


if __name__ == "__main__":
    app = web.Application()
    app.add_routes([
        web.post('/graphql', handle_graphql),
    ])
    app['graphql-endpoint'] = AsyncGraphQLEndpoint(
        Engine(AsyncIOExecutor()), QUERY_GRAPH
    )
    app['redis'] = Redis()
    web.run_app(app, host='0.0.0.0', port=5000)

FastAPI#

import uvicorn
from fastapi import FastAPI, Request

from hiku.types import  String
from hiku.graph import Graph, Root, Field
from hiku.engine import Engine
from hiku.endpoint.graphql import AsyncGraphQLEndpoint
from hiku.executors.asyncio import AsyncIOExecutor

def say_hello(fields):
    return ['Hello World!' for _ in fields]

QUERY_GRAPH = Graph([
    Root([Field('hello', String, say_hello)]),
])

app = FastAPI()

graphql_endpoint = AsyncGraphQLEndpoint(
    Engine(AsyncIOExecutor()), QUERY_GRAPH
)
redis = Redis()

@app.post('/graphql')
async def handle_graphql(request: Request):
    data = await request.json()
    context = {
        'redis': redis,
    }
    return await graphql_endpoint.dispatch(data, context)


if __name__ == "__main__":
    uvicorn.run(__name__ + ":app", port=5000, host="0.0.0.0")