Django ImportError в /graphql

Просто не могу понять, что не так: не удалось импортировать «ss.schema.schema» для настройки Graphene «SCHEMA». AttributeError: объект типа «Запрос» не имеет атрибута «_meta».

Это мой класс Query в файле приложения «pages.schema.py»:

class Query(graphene.AbstractType):
    user = graphene.relay.Node.Field(UserNode)
    users = DjangoFilterConnectionField(UserNode, filterset_class=UserFilter)

Это полное содержимое файла корневой схемы "ss.schema.py::

import graphene

import pages.schema


class Query(pages.schema.Query, graphene.ObjectType):
    pass


class Mutation(pages.schema.Mutation, graphene.ObjectType):
    pass


schema = graphene.Schema(query=Query, mutation=Mutation)

И вот полная трассировка:

Environment:


Request Method: GET
Request URL: http://95.213.203.11/graphql

Django Version: 1.11.5
Python Version: 3.5.2
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'corsheaders',
 'ws4redis',
 'graphene_django',
 'pages']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'corsheaders.middleware.CorsMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "/root/ss/lib/python3.5/site-packages/graphene_django/settings.py" in import_from_string
  74.         module = importlib.import_module(module_path)

File "/root/ss/lib/python3.5/importlib/__init__.py" in import_module
  126.     return _bootstrap._gcd_import(name[level:], package, level)

File "./ss/schema.py" in <module>
  3. import pages.schema

File "./pages/schema.py" in <module>
  130. schema = graphene.Schema(query=Query, mutation=Mutation)

File "/root/ss/lib/python3.5/site-packages/graphene/types/schema.py" in __init__
  27.         ).format(query)

File "/root/ss/lib/python3.5/site-packages/graphene/utils/subclass_with_meta.py" in __repr__
  11.         return cls._meta.name

During handling of the above exception (type object 'Query' has no attribute '_meta'), another exception occurred:

File "/root/ss/lib/python3.5/site-packages/django/core/handlers/exception.py" in inner
  41.             response = get_response(request)

File "/root/ss/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
  187.                 response = self.process_exception_by_middleware(e, request)

File "/root/ss/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
  185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/root/ss/lib/python3.5/site-packages/django/views/decorators/csrf.py" in wrapped_view
  58.         return view_func(*args, **kwargs)

File "/root/ss/lib/python3.5/site-packages/django/views/generic/base.py" in view
  62.             self = cls(**initkwargs)

File "/root/ss/lib/python3.5/site-packages/graphene_django/views.py" in __init__
  70.             schema = graphene_settings.SCHEMA

File "/root/ss/lib/python3.5/site-packages/graphene_django/settings.py" in __getattr__
  116.             val = perform_import(val, attr)

File "/root/ss/lib/python3.5/site-packages/graphene_django/settings.py" in perform_import
  60.         return import_from_string(val, setting_name)

File "/root/ss/lib/python3.5/site-packages/graphene_django/settings.py" in import_from_string
  78.         raise ImportError(msg)

Exception Type: ImportError at /graphql
Exception Value: Could not import 'ss.schema.schema' for Graphene setting 'SCHEMA'. AttributeError: type object 'Query' has no attribute '_meta'.

Любые предложения, как это исправить?


person Alexander Shpindler    schedule 13.11.2017    source источник
comment
Можете ли вы предоставить полное содержание вашего ss.schema.py ?   -  person Clément Denoix    schedule 14.11.2017
comment
@ClémentDenoix хорошо. Это сделано.   -  person Alexander Shpindler    schedule 14.11.2017
comment
Спасибо. Я вижу проблему в вашем ss.shema.py. Строка импорта import pages.schema конфликтует с переменной shema, определенной внизу в том же файле.   -  person Clément Denoix    schedule 14.11.2017
comment
@ClémentDenoix Спасибо, вы правы. Однако после этого исправления проблема немного изменилась: не удалось импортировать «ss.schema.schema» для настройки Graphene «SCHEMA». AttributeError: объект «NoneType» не имеет атрибута «_meta».   -  person Alexander Shpindler    schedule 14.11.2017
comment
Можете ли вы обновить файл схемы в соответствии с внесенными вами изменениями, пожалуйста?   -  person Clément Denoix    schedule 14.11.2017
comment
@ClémentDenoix ss/schema.py не изменился. Я только что удалил строку, в которой я создал объект схемы в pages/schema.py.   -  person Alexander Shpindler    schedule 14.11.2017


Ответы (1)


Легкость, с которой Graphene (и подобные фреймворки, такие как Django и SQLAlchemy) позволяет нам строить нашу схему и включать логику программы без необходимости писать много шаблонов, имеет темную сторону: довольно часто сообщения об ошибках и обратные трассировки, которые они дают, мало что делают. чтобы указать нам на фактическую ошибку.

Так обстоит дело здесь. У вас нет ничего плохого в ss/schema.py, проблема должна быть в pages/schema.py. Поскольку вы дали нам так мало этого, я не могу сказать, что, но вот немного конкретизированный пример, основанный на вашем коде, который работает в Graphene 2.0:

СС/схема.py:

import graphene

import pages.schema

class Query(pages.schema.Query, graphene.ObjectType):
    pass

#class Mutation(pages.schema.Mutation, graphene.ObjectType):
#    pass

#schema = graphene.Schema(query=Query, mutation=Mutation)
schema = graphene.Schema(query=Query)

страницы/models.py:

from django.db import models

class User(models.Model):
    name = models.CharField(max_length=100)

страницы/схема.py:

from django_filters import FilterSet
from graphene import relay
from graphene_django import DjangoObjectType
from graphene_django.filter import DjangoFilterConnectionField

from .models import User

class UserNode(DjangoObjectType):
    class Meta:
        model = User
        interfaces = (relay.Node, )

class UserFilter(FilterSet):
    class Meta:
        model = User
        fields = ['name']

class Query(object):
    user = relay.Node.Field(UserNode)
    users = DjangoFilterConnectionField(UserNode, filterset_class=UserFilter)

Протестировано со следующим запросом:

{
  users {
    edges {
      node {
        id
        ... on UserNode {
          name
        }
      }
    }
  }
}

Надеюсь, что-то там укажет вам правильное направление. Если нет, опубликуйте больше своих страниц/schema.py, и мы начнем с этого.

person Sean Bolton    schedule 15.11.2017