2016-08-18 27 views

Odpowiedz

15

Na przykład, jeśli używasz authentication_classes = (TokenAuthentication,) w widokach API, należy dodać punkt końcowy do GraphQLView ozdobione w ten sposób:

urls.py:

# ... 
from rest_framework.authentication import TokenAuthentication 
from rest_framework.permissions import IsAuthenticated 
from rest_framework.decorators import authentication_classes, permission_classes, api_view 

def graphql_token_view(): 
    view = GraphQLView.as_view(schema=schema) 
    view = permission_classes((IsAuthenticated,))(view) 
    view = authentication_classes((TokenAuthentication,))(view) 
    view = api_view(['POST'])(view) 
    return view 

urlpatterns = [ 
# ... 
    url(r'^graphql_token', graphql_token_view()), 
    url(r'^graphql', csrf_exempt(GraphQLView.as_view(schema=schema))), 
    url(r'^graphiql', include('django_graphiql.urls')), 
# ... 

pamiętać, że dodano nowy punkt końcowy ^graphql_token i zachowano oryginalną wersję ^graphql używaną przez narzędzie GraphiQL.

Następnie należy ustawić nagłówek Authorization w kliencie GraphQL i wskazać punkt końcowy graphql_token.

+0

Czy to nadal działa? Próbuję zrobić to samo z SessionAuthentication, ale dostaję błąd z powrotem od graphene-django, gdy próbuje odczytać treść żądania? – Joe

+0

Nadal działa, ale nie mam najbardziej aktualnych wersji pakietów. Moja odpowiedź używane: Django == 1.8.3 djangorestframework == 3.2.2 django-graphiql == 0.4.4 grafenu == 0.10.2 graphql-core == 0.5.3 graphql-django-view = = 1,3 graphql-relay == 0.4.4 –

3

Dodanie kilku dodatkowych kroków, które musiałem podjąć, gdy po tej integracji:

class RTGraphQLView(GraphQLView): 

def parse_body(self, request): 
    if type(request) is rest_framework.request.Request: 
     return request.data 
    return super().parse_body(request) 

Grafen spodziewałem się .body attr ale DRF czyta i przywiązuje go do .data zanim przeszedł do GraphQLView.