首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何组合突变以在django-graphql中创建或登录用户?

如何组合突变以在django-graphql中创建或登录用户?
EN

Stack Overflow用户
提问于 2018-03-14 02:18:48
回答 3查看 2.9K关注 0票数 4

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

现在我有:

代码语言:javascript
复制
# 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()

我尝试了不同的变体,但我似乎不完全理解图形的工作流或\以及神奇的Graphene做什么(它的文档没有提供信息)。

有人能告诉我,我如何在已经创建的代码块(CreateUser类和graphql_jwt.ObtainJSONWebToken.Field())中重用?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-03-15 03:23:33

  1. 我没有找到如何从突变中调用突变(我如何从class GetOrCreateUser调用class GetOrCreateUser,所以我决定将CreateUser集成到GetOrCreateUser中)。
  2. 我没有找到如何通过类似的代码调用graphql_jwt (示例取自石墨烯文档) schema =graphene.Schema(.)结果=schema.execute({ name }) 因此,我决定直接通过Python获取令牌,而不是Python\GraphQL。

以下是完整的代码:

代码语言:javascript
复制
# 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)

代码语言:javascript
复制
# 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()

FrontEnd可以通过检查token字段来定义状态。如果为空,则创建user,如果存在某些内容,则用户存在并仅登录。

票数 0
EN

Stack Overflow用户

发布于 2020-01-28 14:31:35

django-graphql-auth做的正是你想要的。

它扩展了django-graphql来处理所有与用户帐户相关的操作。

这是来自文档的注册突变

代码语言:javascript
复制
mutation {
  register(
    email:"skywalker@email.com",
    username:"skywalker",
    password1: "supersecretpassword",
    password2:"supersecretpassword"
  ) {
    success,
    errors,
    token,
    refreshToken
  }
}

它已经从django-graphql返回令牌和刷新令牌。

无法用于从文档登录。

代码语言:javascript
复制
mutation {
  tokenAuth(
    # username or email
    email: "skywalker@email.com"
    password: "supersecretpassword"
  ) {
    success,
    errors,
    token,
    refreshToken,
    unarchiving,
    user {
      id,
      username
    }
  }
}

PS:我是作者

票数 4
EN

Stack Overflow用户

发布于 2018-03-14 15:23:35

您可以创建一个函数并在这两种突变中使用它:

代码语言:javascript
复制
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'}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49268812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档