如何在django graphql jwt中结合突变创建或登录用户?

如何在django graphql jwt中结合突变创建或登录用户?,django,graphql,graphene-python,Django,Graphql,Graphene Python,我使用VueJS和Django+(返回令牌)。我想使用电子邮件\密码字段进行注册和登录。在服务器上,我想检查提供的电子邮件是否已经存在->使用django graphql jwt的变种token\u auth=graphql\u jwt.ObtainJSONWebToken.Field()返回token+消息,否则->使用提供的电子邮件和密码创建一个新用户并返回此用户+消息 目前我有: # schema.py import graphene import graphql_jwt from d

我使用VueJS和Django+(返回令牌)。我想使用电子邮件\密码字段进行注册和登录。在服务器上,我想检查提供的电子邮件是否已经存在->使用django graphql jwt的变种
token\u auth=graphql\u jwt.ObtainJSONWebToken.Field()
返回token+消息,否则->使用提供的电子邮件和密码创建一个新用户并返回此用户+消息

目前我有:

# schema.py

import graphene
import graphql_jwt

from django.contrib.auth import get_user_model
from graphene_django import DjangoObjectType


class UserType(DjangoObjectType):
    class Meta:
        model = get_user_model()


class CreateUser(graphene.Mutation):
    user = graphene.Field(UserType)

    class Arguments:
        password = graphene.String(required=True)
        email = graphene.String(required=True)

    def mutate(self, info, password, email):
        user = get_user_model()(
            username=email.split('@')[0],
            email=email,
        )
        user.set_password(password)
        user.save()

        return CreateUser(user=user)

# Want to combine two mutations here
class GetOrCreateUser(graphene.Mutation):
    user = graphene.Field(UserType)

    class Arguments:
        password = graphene.String(required=True)
        email = graphene.String(required=True)

    def mutate(self, info, password, email):
        # Return token
        if get_user_model().objects.filter(email=email).exists():
            # Just an idea, what I want to get here (to be returned to VueJS)
            return {'token': graphql_jwt.ObtainJSONWebToken.Field(), 'msg': 'Token Generated'}

        # Create new user
        else:
            user = CreateUser(???)
            return {'user': user, 'msg': 'User is Created'}


class Mutation(graphene.ObjectType):
    create_user = CreateUser.Field()
    get_or_create_user = GetOrCreateUser.Field()
我尝试了不同的变体,但似乎我不完全理解graph的工作流程或\以及magic
Graphene
的功能(其文档没有提供信息)


有谁能告诉我,我如何在if\else块中重用已经创建的代码(
CreateUser
类和
graphql\u jwt.ObtainJSONWebToken.Field()
)?

您可以创建一个函数并在两种情况下使用它:

def get_or_create_user(password, email):
    if get_user_model().objects.filter(email=email).exists():
        return ('user or token or other data that you need in'
                'mutation, this is not mutation return value')
               # {'token': graphql_jwt.ObtainJSONWebToken.Field(),
               # 'msg': 'Token Generated'}

    # Create new user
    else:
        user = get_user_model()(
            username=email.split('@')[0],
            email=email,
        )
        user.set_password(password)
        user.save()

        return ('user or token or other data that you need in'
                'mutation, this is not mutation return value')
               # {'user': user,
               # 'msg': 'User is Created'}
  • 我没有找到如何从突变中调用突变(如何从
    类GetOrCreateUser
    调用
    类CreateUser
    ,因此我决定将
    CreateUser
    集成到
    GetOrCreateUser

  • 我没有找到如何通过这样的代码调用
    graphql\u jwt
    (示例取自)

    所以我决定直接通过Python而不是Python\GraphQL获取令牌

  • 以下是完整代码:

    # schema.py (the root one)
    import graphene
    import graphql_jwt
    import apps.users.schema
    
    
    class Query(apps.users.schema.Query, graphene.ObjectType):
        pass
    
    
    class Mutation(apps.users.schema.Mutation, graphene.ObjectType):
        verify_token = graphql_jwt.Verify.Field()
        refresh_token = graphql_jwt.Refresh.Field()
    
    
    schema = graphene.Schema(query=Query, mutation=Mutation)
    

    前端可以通过检查
    令牌
    字段来定义状态。如果为空,则创建than user,如果有,则than user存在并刚刚登录。

    完全符合您的要求

    它扩展了django graphql jwt以处理所有与用户帐户相关的操作

    以下是来自的注册代码:

    突变{
    登记册(
    电子邮件:“skywalker@email.com",
    用户名:“天行者”,
    密码1:“超级机密密码”,
    密码2:“超级机密密码”
    ) {
    成功,,
    错误,
    代币
    刷新令牌
    }
    }
    
    它已经从django graphql jwt返回了令牌和刷新令牌

    您可以通过以下方式登录:

    突变{
    tokenAuth(
    #用户名或电子邮件
    电子邮件:“skywalker@email.com"
    密码:“超级机密密码”
    ) {
    成功,,
    错误,
    代币
    刷新令牌,
    无拱形,
    使用者{
    身份证件
    用户名
    }
    }
    }
    

    PS:我是作者

    石墨烯不会像这样工作。1)
    graphql\u jwt.ObtainJSONWebToken.Field()
    不返回值(不返回字符串),它返回对象。2) 据我所知,返回项目的类型必须与在
    类GetOrCreateUser(graphene.Mutation)下声明的类型相同:
    ,但我不知道我应该使用哪种类型作为
    dict
    @TitanFighter我刚刚复制了您的代码。此函数的目的是-组合两个突变的if/else逻辑。。。
    # schema.py (the root one)
    import graphene
    import graphql_jwt
    import apps.users.schema
    
    
    class Query(apps.users.schema.Query, graphene.ObjectType):
        pass
    
    
    class Mutation(apps.users.schema.Mutation, graphene.ObjectType):
        verify_token = graphql_jwt.Verify.Field()
        refresh_token = graphql_jwt.Refresh.Field()
    
    
    schema = graphene.Schema(query=Query, mutation=Mutation)
    
    # users/schema.py
    import graphene
    
    from django.contrib.auth import get_user_model
    from graphene_django import DjangoObjectType
    from graphql_jwt.shortcuts import get_token
    
    
    class UserType(DjangoObjectType):
        class Meta:
            model = get_user_model()
    
    
    class GetOrCreateUser(graphene.Mutation):
        """
        mutation {
          getOrCreateUser(email: "test@domain.com", password: "YourPass") {
            token
            user {
              id
              email
              isActive
            }
          }
        }
        """
    
        user = graphene.Field(UserType)
        token = graphene.String()
    
        class Arguments:
            password = graphene.String(required=True)
            email = graphene.String(required=True)
    
        def mutate(self, info, password, email):
            token = ''
    
            # Return token
            if get_user_model().objects.filter(email=email).exists():
                user = get_user_model().objects.get(email=email)
                token = get_token(user)
    
            # Create new user
            else:
                user = get_user_model()(
                    username=email.split('@')[0],
                    email=email,
                )
                user.set_password(password)
                user.save()
    
            return GetOrCreateUser(user=user, token=token)
    
    
    class Query(graphene.ObjectType):
        users = graphene.List(UserType)
    
        def resolve_users(self, info):
            return get_user_model().objects.all()