使用:
\n\n我正在使用 Django、GraphQL 和 Vue-Apollo 测试单页 vue app\xc2\xb4s。
\n\n如果我csrf_exempt在我的视图中使用,一切都会在前端运行。
urlpatterns = [\n<...>\n path("graphql", csrf_exempt(GraphQLView.as_view(graphiql=True))),\n<...>\nRun Code Online (Sandbox Code Playgroud)\n\n现在我想要 CSRF 保护我的请求。\n在理解 CSRF 保护的过程中,我认为 DjangoGraphQLView所需要的只是接收X-Csrftoken请求标头中的“值”。所以我专注于csrf以不同的方式发送值......通过像这样的单一视图
path(\'csrf/\', views.csrf),\npath("graphql", GraphQLView.as_view(graphiql=True)),\nRun Code Online (Sandbox Code Playgroud)\n\n或者通过确保 cookieensure_csrf_cookie
然后在我的ApolloClienti 中获取这些 Value 并将其与请求 Header 一起发回。
这是当我从 Django-Vue 页面发送 GraphQL 请求时 Django 打印的内容。
\n\nForbidden (CSRF token missing or …Run Code Online (Sandbox Code Playgroud) 我正在尝试设置 Graphene,但在浏览器中打开 http://localhost:8000/graphql/ 时出现以下异常:
TemplateDoesNotExist at /graphql/
graphene/graphiql.html
Request Method: GET
Request URL: http://localhost:8000/graphql/
Django Version: 3.2.10
Run Code Online (Sandbox Code Playgroud)
添加了整个设置、添加到 URL、配置架构、查询和突变。但还是不行。甚至不记得曾经需要为石墨烯配置模板。
我使用“DjangoListField()”和“graphene.List()”与解析器来列出所有对象。
schema.py 中的“DjangoListField()”:
import graphene
from graphene_django import DjangoObjectType
from graphene_django import DjangoListField
from .models import Category
class CategoryType(DjangoObjectType):
class Meta:
model = Category
fields = ("id","name")
class Query(graphene.ObjectType):
all_categories = DjangoListField(CategoryType) # DjangoListField()
def resolve_all_categories(root, info): # Resolver to list all objects
return Category.objects.all()
schema = graphene.Schema(query=Query)
Run Code Online (Sandbox Code Playgroud)
schema.py 中的“graphene.List()”:
import graphene
from graphene_django import DjangoObjectType
from .models import Category
class CategoryType(DjangoObjectType):
class Meta:
model = Category
fields = ("id","name")
class Query(graphene.ObjectType):
all_categories = …Run Code Online (Sandbox Code Playgroud) 我对 Graphene 非常陌生,正在测试它,看看是否可以将它用于具有复杂查询的 Django 项目。为了测试它,我尝试使用以下模型创建一个电子商务
class Sku(models.Model):
name = models.CharField(max_length=100)
class Product(models.Model):
name = models.CharField(max_length=100)
class ProductSku(models.Model):
sku = models.ForeignKey(Sku, related_name='product_sku', on_delete=models.CASCADE)
product = models.ForeignKey(Product, related_name='product_sku', on_delete=models.CASCADE)
price = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)
正如您在此处看到的,Product 和 Sku 使用 ProductSku 模型具有多对多关系
使用 Graphene 的文档我创建了以下架构
class SkuNode(DjangoObjectType):
class Meta:
model = Sku
class ProductNode(DjangoObjectType):
class Meta:
model = Product
class ProductSkuNode(DjangoObjectType):
class Meta:
model = ProductSku
class Query(graphene.ObjectType):
all_products = graphene.List(ProductNode, name=graphene.String())
product = graphene.Field(ProductNode, id=graphene.Int())
def resolve_all_products(self, info, **args):
name = args.get('name')
if name is …Run Code Online (Sandbox Code Playgroud) 我有一个带有继电器和过滤器的石墨烯接口。它工作得很好,但我想添加 order_by 选项。我的对象看起来像:
class FooGQLType(DjangoObjectType):
class Meta:
model = Foo
exclude_fields = ('internal_id',)
interfaces = (graphene.relay.Node,)
filter_fields = {
"id": ["exact"],
"code": ["exact", "icontains"],
}
connection_class = ExtendedConnection
class Query(graphene.ObjectType):
foo = DjangoFilterConnectionField(FooGQLType)
Run Code Online (Sandbox Code Playgroud)
ExtendedConnection 不应该相关,但是:
class ExtendedConnection(graphene.Connection):
class Meta:
abstract = True
total_count = graphene.Int()
def resolve_total_count(root, info, **kwargs):
return root.length
Run Code Online (Sandbox Code Playgroud)
这使我可以像foo(code_Icontains:"bar"). 根据石墨烯文档,我应该为此在 FilterSet 中使用 OrderingFilter 。我觉得有点烦人,因为过滤器应该是自动的,但如果我这样做:
class FooGQLFilter(FilterSet):
class Meta:
model = Foo
order_by = OrderingFilter(
fields=(
('code', 'code'),
('lastName', 'last_name'),
('otherNames', 'other_names'),
)
) …Run Code Online (Sandbox Code Playgroud) 所以我的模型看起来像
class Abcd(models.Model):
name = models.CharField(max_length=30, default=False)
data = models.CharField(max_length=500, blank=True, default=False)
Run Code Online (Sandbox Code Playgroud)
需要在查询时传递一个字典,它不是模型的一部分,查询是
query {
allAbcd(Name: "XYZ") {
edges {
node {
Data
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何通过查询传递这样一个自定义字段?
此自定义字段对于其他流程目的是必需的。
我已经定义了包含与枚举对应的文本选项的字段的 Django 模型。GraphQL API 提供了具有枚举类型参数的突变(不是直接从模型派生的),这些参数应仅接受与模型相同的值。我怎样才能摆脱我的重复?
模型.py:
class SomeModel(models.Model):
class SomeEnum(models.TextChoices):
A = "A", _("Option A")
B = "B", _("Option B")
enum_field = models.CharField(
max_length=1,
choices=SomeEnum.choices,
default=SomeEnum.A,
)
Run Code Online (Sandbox Code Playgroud)
架构.py:
class SomeEnumSchema(graphene.Enum):
A = "A"
B = "B"
class SomeMutation(graphene.Mutation):
class Arguments:
some_enum = SomeEnumSchema(required=True)
Run Code Online (Sandbox Code Playgroud) mutation{
createPayment(p_obj={"bob": 80, "job": 100}){
<fields here>
}
}
Run Code Online (Sandbox Code Playgroud)
我能找到的是接受对象列表作为输入,例如:
[ {username: "bob", "amount": 80}, {username: "job", "amount": 100} ]
Run Code Online (Sandbox Code Playgroud) 您如何编写架构和查询嵌套外键?我检查了文档,但没有找到如何执行此操作的示例。所以这是我基于 github 和 stackoverflow 答案的尝试,可以说我有这些模型:
class Address(models.Model):
name = models.CharField()
class Person(models.Model):
name = models.CharField()
address = models.ForeignKey('Address', on_delete=models.CASCADE, blank=False, null=False)
class Blog(models.Model):
person = models.ForeignKey('Person', on_delete=models.CASCADE, blank=False, null=False)
text = models.TextField()
Run Code Online (Sandbox Code Playgroud)
我尝试编写这样的模式:
class AddressInput(graphene.InputObjectType):
name = graphene.String(required=True)
class PersonInput(graphene.InputObjectType):
name = graphene.String(required=True)
address =graphene.Field(AddressInput)
class CreateNewBlog(graphene.Mutation):
blog=graphene.Field(BlogType)
class Arguments:
address_data = AddressInput()
person_data = PersonInput()
text = graphene.String()
@staticmethod
def mutate(root, info, person_data=None, address_data=None, **input):
address = Address.objects.create(name=address_data.name)
person = Person.objects.create(address=address, name=person_data.name)
blog = Blog.objects.create(person =person, text=input['text'])
blog.save()
return …Run Code Online (Sandbox Code Playgroud) 我一直在开发一个使用 graphene/graphql 的 Django 应用程序,该应用程序使用 Docker alpine 镜像在 AWS 上运行。我一直在使用 django-grapql-jwt-0.3.1 模块在我的应用程序中调用 jwt-2.0.0 身份验证。它从 PyJWT 调用 ExpiredSignature 而不是 ExpiredSignatureError。graphQL 返回“模块‘jwt’没有属性‘ExpiredSignature’”错误。如何解决问题?
graphene-django ×10
django ×9
graphql ×5
python ×4
python-3.x ×3
jwt ×1
pyjwt ×1
vue-apollo ×1