我使用VueJS和Django + django-graphql (返回令牌)。我想使用电子邮件\密码字段进行注册和登录。在服务器上,我想检查提供的电子邮件是否已经存在,->使用django-graphql-jwt的突变token_auth = graphql_jwt.ObtainJSONWebToken.Field()返回令牌+消息,否则->使用提供的电子邮件和密码创建一个新用户并返回此用户+消息。
现在我有:
# 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())中重用?
发布于 2018-03-15 03:23:33
class GetOrCreateUser调用class GetOrCreateUser,所以我决定将CreateUser集成到GetOrCreateUser中)。graphql_jwt (示例取自石墨烯文档)
schema =graphene.Schema(.)结果=schema.execute({ name })
因此,我决定直接通过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)和
# 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,如果存在某些内容,则用户存在并仅登录。
发布于 2020-01-28 14:31:35
django-graphql-auth做的正是你想要的。
它扩展了django-graphql来处理所有与用户帐户相关的操作。
这是来自文档的注册突变
mutation {
register(
email:"skywalker@email.com",
username:"skywalker",
password1: "supersecretpassword",
password2:"supersecretpassword"
) {
success,
errors,
token,
refreshToken
}
}它已经从django-graphql返回令牌和刷新令牌。
无法用于从文档登录。
mutation {
tokenAuth(
# username or email
email: "skywalker@email.com"
password: "supersecretpassword"
) {
success,
errors,
token,
refreshToken,
unarchiving,
user {
id,
username
}
}
}PS:我是作者
发布于 2018-03-14 15:23:35
您可以创建一个函数并在这两种突变中使用它:
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'}https://stackoverflow.com/questions/49268812
复制相似问题