标签: graphene-django

石墨烯 django 端点是否同时需要 X-Csrftoken 和 CsrfCookie?

使用:

\n\n
    \n
  • Django 3.x [ Django 过滤器 2.2.0、graphene-django 2.8.0、graphql-relay 2.0.1 ]
  • \n
  • Vue 2.x [Vue-阿波罗]
  • \n
\n\n
\n\n

我正在使用 Django、GraphQL 和 Vue-Apollo 测试单页 vue app\xc2\xb4s。

\n\n

如果我csrf_exempt在我的视图中使用,一切都会在前端运行。

\n\n
urlpatterns = [\n<...>\n   path("graphql", csrf_exempt(GraphQLView.as_view(graphiql=True))),\n<...>\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在我想要 CSRF 保护我的请求。\n在理解 CSRF 保护的过程中,我认为 DjangoGraphQLView所需要的只是接收X-Csrftoken请求标头中的“值”。所以我专注于csrf以不同的方式发送值......通过像这样的单一视图

\n\n
path(\'csrf/\', views.csrf),\npath("graphql", GraphQLView.as_view(graphiql=True)),\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者通过确保 cookieensure_csrf_cookie

\n\n

然后在我的ApolloClienti 中获取这些 Value 并将其与请求 Header 一起发回。

\n\n

这是当我从 Django-Vue 页面发送 GraphQL 请求时 Django 打印的内容。

\n\n
Forbidden (CSRF token missing or …
Run Code Online (Sandbox Code Playgroud)

django graphql graphene-python vue-apollo graphene-django

4
推荐指数
1
解决办法
2802
查看次数

TemplateDoesNotExist graphene/graphiql.html

我正在尝试设置 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、配置架构、查询和突变。但还是不行。甚至不记得曾经需要为石墨烯配置模板。

python django graphene-python graphene-django

4
推荐指数
1
解决办法
934
查看次数

Graphene Django 中的 DjangoListField() 与 graphene.List()

我使用“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)

python django python-3.x graphql graphene-django

4
推荐指数
1
解决办法
1589
查看次数

石墨烯和姜戈的关系

我对 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)

python django graphene-python graphene-django

3
推荐指数
1
解决办法
3717
查看次数

Django 石墨烯中继 order_by (OrderingFilter)

我有一个带有继电器和过滤器的石墨烯接口。它工作得很好,但我想添加 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)

django graphene-python graphene-django

3
推荐指数
2
解决办法
3326
查看次数

如何在 graphene django 中添加数据库中不存在的自定义字段

所以我的模型看起来像

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 graphene-python graphene-django

3
推荐指数
1
解决办法
3624
查看次数

如何为 django 模型和 graphql 突变参数使用单个枚举?

我已经定义了包含与枚举对应的文本选项的字段的 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)

python django django-models graphql graphene-django

3
推荐指数
1
解决办法
904
查看次数

我如何接受字典/对象作为石墨烯(GraphQL)突变的输入?

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)

python-3.x graphql graphene-python graphene-django

2
推荐指数
1
解决办法
2054
查看次数

Django Graphene 用多层嵌套外键编写突变

您如何编写架构和查询嵌套外键?我检查了文档,但没有找到如何执行此操作的示例。所以这是我基于 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)

django python-3.x graphql graphene-django

2
推荐指数
1
解决办法
1331
查看次数

模块“jwt”没有属性“ExpiredSignature”

我一直在开发一个使用 graphene/graphql 的 Django 应用程序,该应用程序使用 Docker alpine 镜像在 AWS 上运行。我一直在使用 django-grapql-jwt-0.3.1 模块在我的应用程序中调用 jwt-2.0.0 身份验证。它从 PyJWT 调用 ExpiredSignature 而不是 ExpiredSignatureError。graphQL 返回“模块‘jwt’没有属性‘ExpiredSignature’”错误。如何解决问题?

在此输入图像描述

django jwt pyjwt graphene-django django-graphql-jwt

2
推荐指数
1
解决办法
5808
查看次数