如何在 Python 中验证 GraphQL 突变

Posted

技术标签:

【中文标题】如何在 Python 中验证 GraphQL 突变【英文标题】:How do you validate a GraphQL mutation in Python 【发布时间】:2018-08-23 07:05:32 【问题描述】:

我是 GraphQL 的新手。我正在使用Graphene-Django 并有一个名为CreateUser 的突变。它需要三个参数usernameemailpassword

如何验证数据并返回多个错误?

我想要这样的东西返回。

  
   "name":[  
      "Ensure this field has at least 2 characters."
   ],
   "email":[  
      "This field may not be blank."
   ],
   "password":[  
      "This field may not be blank."
   ]

所以我可以像这样在表单上呈现错误:

到目前为止我的代码:

from django.contrib.auth.models import User as UserModel
from graphene_django import DjangoObjectType
import graphene


class User(DjangoObjectType):
    class Meta:
        model = UserModel
        only_fields = 'id', 'username', 'email'


class Query(graphene.ObjectType):
    users = graphene.List(User)
    user = graphene.Field(User, id=graphene.Int())

    def resolve_users(self, info):
        return UserModel.objects.all()

    def resolve_user(self, info, **kwargs):
        try:
            return UserModel.objects.get(id=kwargs['id'])
        except (UserModel.DoesNotExist, KeyError):
            return None


class CreateUser(graphene.Mutation):

    class Arguments:
        username = graphene.String()
        email = graphene.String()
        password = graphene.String()

    user = graphene.Field(User)

    def mutate(self, info, username, email, password):
        user = UserModel.objects.create_user(username=username, email=email, password=password)
        return CreateUser(user=user)


class Mutation(graphene.ObjectType):
    create_user = CreateUser.Field()


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

【问题讨论】:

嗨,我也在寻找类似的东西,并想出了一个小型 PoC 来在 Graphene 上进行 Django Rest Framework 之类的验证:github.com/chpmrc/graphene-validator。随意尝试,非常欢迎反馈!由于尚未准备好发布,因此未发布作为答案。 @MarcoChiappetta 您是否将其与 GraphQL 代码生成器/Formik/是的一起使用?我是这个堆栈的新手,但你的验证器会融入其中吗?您能指出任何使用该完整堆栈的文章/文档吗?从石墨烯到前端形式的文档似乎并不多。 【参考方案1】:

模式中的模型错误,主要是使用联合。

SDL 格式:

type RegisterUserSuccess 
  user: User!


type FieldError 
  fieldName: String!
  errors: [String!]!


type RegisterUserError 
  fieldErrors: [FieldError!]!
  nonFieldErrors: [String!]!



union RegisterUserPayload = RegisterUserSuccess | RegisterUserError

mutation 
  registerUser(name: String, email: String, password: String): RegisterUserPayload!

【讨论】:

以上是关于如何在 Python 中验证 GraphQL 突变的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 python 调用具有 Cognito 身份验证的 AppSync 突变?

如何从graphql突变返回令牌

在 Graphql 操场上使用 AWS Cognito 用户池对 AppSync 突变进行身份验证

如何使用动态别名在单个请求中多次调用 GraphQL 突变

是否可以从 Relay 突变访问 GraphQL 验证错误?

给定 GraphQL 模式,是不是可以进行客户端预突变验证?