Python serailize Rest и GraphQL одинаковы

Я играю с GraphQL (графен), пишу небольшое приложение на основе Python/Falcon, которое возвращает список постов, как в Rest & GraphQL:

from falcon import API, json
import graphene

def get_all_posts():
    posts = [
        {
            'content': (
                'Hello, '
                "World..."
            ),
            'author': 'Unknown author'
        }
    ]
    return posts


class Query(graphene.ObjectType):
    posts = graphene.String()

    def resolve_posts(self, info):
        return get_all_posts()


schema = graphene.Schema(query=Query)

class PostsResource:
    def on_get(self, req, resp):
        posts = get_all_posts()
        resp.media = {'posts': json.dumps(posts)}


class GraphQLResource:
    def on_get(self, req, resp):
        query = req.params['query']
        result = schema.execute(query)
        resp.media = result.data


api = API()
api.add_route('/graphql', GraphQLResource())
api.add_route('/posts', PostsResource())

Запросы к GraphQL (localhost / graphql? Query = query% 20posts% 20 {% 20posts% 20})

{"posts": "[{'content': 'Hello, World...', 'author': 'Unknown author'}]"}

и Использование конечной точки отдыха (localhost / posts)

{"posts": "[{\" content \ ": \" Hello, World... \ ", \" author \ ": \" Неизвестный автор \"}]"}

Я не уверен, что это даже важно, но мне было интересно, почему он был сериализован по-другому?.. Возможно ли вообще сделать его таким же?

Есть ли смысл пытаться добиться этого?

Любая помощь будет оценена! Спасибо!

  • PS Если я не сбрасываю (json.dumps()) результат в остальной конечной точке я получаю:

{"posts": [{"content": "Hello, World...", "author": "Неизвестный автор"}]}

1 ответ

Похоже, что он сериализует весь список сообщений в одну строку (posts = graphene.String()). я не слишком знаком с graphene но, вероятно, вам нужно создать вложенную схему - что-то вроде этого:

class Post(graphene.ObjectType):
    content = graphene.String()
    author = graphene.String()

class Query(graphene.ObjectType):
    # or Field instead of List, I'm not sure about that.
    posts = graphene.List(Post)

Я надеюсь, что это поможет вам двигаться дальше с вашей проблемой

Другие вопросы по тегам