Запросы GraphQL в Django возвращаются None

Привет, ребята,

поэтому я пытаюсь использовать запросы графа SQL в Django. В основном у меня есть два приложения, мое приложение "api", которое содержит все, что мне нужно для выполнения запросов, и еще одно приложение под названием "frontend", из которого я вызываю API для использования этих запросов.

Я могу использовать представление GraphQL для ввода в него запросов, и он отлично работает, но всякий раз, когда я пытаюсь сделать запрос, я получаю следующее: "OrderedDict([('users', None)])"

Результат моего запроса в представлении GraphQl

И для кода:

В 'api' моя схема.py:

import graphene
import graphql_jwt
from graphene import relay, ObjectType, AbstractType, List, String, Field,InputObjectType
from graphene_django import DjangoObjectType
from graphene_django.filter import DjangoFilterConnectionField
from datetime import date, datetime
from django.contrib.auth.models import User
from django.contrib.auth import get_user_model

....

class Query(graphene.ObjectType):
    me = graphene.Field(UserType)
    users = graphene.List(UserType)
    profile = relay.Node.Field(ProfileNode)
    all_profiles = DjangoFilterConnectionField(ProfileNode)

    def resolve_users(self, info):
        ### Returns all users ###
        user = info.context.user
        if user.is_anonymous:
            raise Exception('Not logged!')
        if not user.is_superuser:
            raise Exception('premission denied')
        return User.objects.all()

    def resolve_me(self, info):
        ### Returns logged user ###
        user = info.context.user
        if user.is_anonymous:
            raise Exception('Not logged!')
        return user

    def resolve_all_profiles(self, info, **kwargs):
        ### Returns all profiles ###
        return Profile.objects.all()

.....

def execute(my_query):
    schema = graphene.Schema(query=Query)
    return schema.execute(my_query)

И views.py, который вызывает приложение "api" в моем интерфейсе приложения:

from django.shortcuts import render
import graphene
from api import schema
from django.contrib.auth import authenticate


def accueil(request):

    if request.user.is_authenticated:
        check = "I am logged"
    else:
        check = "I am not logged"

    result = schema.execute("""query {
                                users {
                                    id
                                    username
                                }
                            }""")

    return render(request, 'frontend/accueil.html', {'result' : result.data, 'check' : check})

Шаблон:

<h1>OTC</h1>
<p> the users are : {{result}}</p>
<br/>
<p>{{check}}</p>
<a href="{%url 'login'  %}">login</a>
<a href="{%url 'logout' %}">logout</a>

и наконец:

Результат веб-страницы

и ошибка в консоли:

An error occurred while resolving field Query.users
Traceback (most recent call last):
  File "/home/victor/myenv/lib/python3.5/site-packages/graphql/execution/executor.py", line 311, in resolve_or_error
    return executor.execute(resolve_fn, source, info, **args)
  File "/home/victor/myenv/lib/python3.5/site-packages/graphql/execution/executors/sync.py", line 7, in execute
    return fn(*args, **kwargs)
  File "/home/victor/poc2/poc2/api/schema.py", line 67, in resolve_users
    user = info.context.user
AttributeError: 'NoneType' object has no attribute 'user'
Traceback (most recent call last):
  File "/home/victor/myenv/lib/python3.5/site-packages/graphql/execution/executor.py", line 330, in complete_value_catching_error
    exe_context, return_type, field_asts, info, result)
  File "/home/victor/myenv/lib/python3.5/site-packages/graphql/execution/executor.py", line 383, in complete_value
    raise GraphQLLocatedError(field_asts, original_error=result)
graphql.error.located_error.GraphQLLocatedError: 'NoneType' object has no attribute 'user'

Любая помощь приветствуется, ребята, я просто не могу понять, почему она не работает, так как я вошел в систему, и все прекрасно работает в представлении graphql

PS: извините, если я допустил ошибку, английский не мой родной язык

1 ответ

Решение

Если вы не пишете тестовый клиент, вы, вероятно, не должны звонить schema.execute изнутри вид Джанго. Но при условии, что у вас есть причины для этого, ваша конкретная проблема заключается в том, что вы не пропускаете пользователя при вызове schema.execute в accueil Посмотреть.

Посмотрите документацию на исполняемый файл, и вы увидите, что вам нужно будет указать необязательный аргумент для контекста. Ваш код не предоставляет контекст, следовательно, info.context является None согласно вашему исключению. К сожалению, пример

result = schema.execute('{ name }', context_value={'name': 'Syrus'})

не является специфичным для Django. Но я думаю, что в функциональном представлении Django работает:

result = schema.execute(query, context_value=request)
Другие вопросы по тегам