如何在django graphql jwt中结合突变创建或登录用户?
我使用VueJS和Django+(返回令牌)。我想使用电子邮件\密码字段进行注册和登录。在服务器上,我想检查提供的电子邮件是否已经存在->使用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
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的工作流程或\以及magicGraphene
的功能(其文档没有提供信息)
有谁能告诉我,我如何在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()