GraphQl + (Python/Django)

¿Qué es GraphQl?

http://facebook.github.io/graphql/

QUERY LANGUAGE

Query languages are computer languages used to make queries in databases and information systems

- Wikipedia

QUERY LANGUAGE

SELECT * FROM tasks

alternativa a rest

rest VS graphql

rest

- Convenciones (que no se respetan)

GRAPHQL

- Tipado por consecuencia validable

rest

GRAPHQL

rest

- El servidor decide que datos retornar

GRAPHQL

- El cliente decide que datos quiere

rest

GRAPHQL

https://mydomain.com/api/v1/tasks
//return
[
    {
        id: "1"
        title: "vistar nicobytes.com",
        completed: false,
        category:{
           id: "1",
           title: "category 1"
        }
    },
    {
        id: "1"
        title: "seguir a @nicobytes",
        completed: false,
        category:{
           id: "1",
           title: "category 2"
        }
    },
    {
        id: "1"
        title: "invitar una cerveza a @nicobytes",
        completed: false,
        category:{
           id: "1",
           title: "category 2"
        }
    }
]

rest

GRAPHQL

query{
    tasks{
        title,
        completed,
        category{
            title
        }
    }   
}

rest

GRAPHQL

[
    {
        title: "vistar nicobytes.com",
        completed: false,
        category:{
           title: "category 1"
        }
    },
    {
        title: "seguir a @nicobytes",
        completed: false,
        category:{
           title: "category 2"
        }
    },
    {
        title: "invitar una cerveza a @nicobytes",
        completed: false,
        category:{
           title: "category 2"
        }
    }
]

rest

- Envia información de más

GRAPHQL

- Obtenemos la información necesaria

rest

- Multiples requests

GRAPHQL

- Un solo request

rest

- Puede llegar a ser complejo de mantener

GRAPHQL

- Facil de mantener

graphql

Queries and Mutations

Schemas and Types

DEMO TIME

GraphQL in Python
made simple

INSTALLED_APPS = [
    ...
    'graphene_django'
]

http://docs.graphene-python.org/projects/django/en/latest/

import graphene
from graphene_django.types import DjangoObjectType
from tasks.models import Task

class TaskType(DjangoObjectType):
    class Meta:
        model = Task

class TasksQuery(graphene.AbstractType):

    task = graphene.Field(TaskType, id=graphene.Int())
    all_tasks = graphene.List(TaskType)

    def resolve_all_tasks(self, args, context, info):
        return Task.objects.all()

    def resolve_task(self, args, context, info):
        id = args.get('id')

        if id is not None:
            return Task.objects.get(pk=id)

        return None
from graphene import ObjectType, Schema
from django.contrib.auth.models import User

from api.schemas.user_schema import UsersQuery
from tasks.schemas.category_schema import CategoryQuery
from tasks.schemas.task_schema import TasksQuery

class Query(CategoryQuery, TasksQuery, UsersQuery, ObjectType):
    # This class will inherit from multiple Queries
    # as we begin to add more apps to our project
    pass

schema = Schema(query=Query)
from django.conf.urls import url, include
from django.contrib import admin
from graphene_django.views import GraphQLView
from api.query import schema

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    url(r'^api/v1/', include('api.urls')),
    url(r'^graphql', GraphQLView.as_view(graphiql=True, schema=schema))
]
  • https://github.com/nicobytes/graphql-django
  • https://github.com/nicobytes/graphql-ionic

Gracias....

Made with Slides.com