标签: graphene-django

从“django.utils.encoding”导入错误“force_text”

我正在使用 python、graphene 和 django 实现 graphql 解决方案,但出现以下导入错误:

Result: Failure Exception: ImportError: cannot import name 'force_text' from 'django.utils.encoding'

"/home/site/wwwroot/.python_packages/lib/site-packages/graphene_django/utils/utils.py", line 6, in <module> from django.utils.encoding import force_text
Run Code Online (Sandbox Code Playgroud)

我不确定版本以及是否需要导入额外的模块。我的requirements.txt是这样的:

graphene>=2.1,<3
graphene-django>=2.1,<3
graphql-core>=2.1,<3
graphql-relay==2.0.1
django-filter>=2
Run Code Online (Sandbox Code Playgroud)

有人遇到过类似的问题吗?可以看看我使用的版本吗?谢谢

python django python-3.x graphql graphene-django

50
推荐指数
4
解决办法
6万
查看次数

大数据集的 Graphene-python 性能问题

目前使用graphene-python 和graphene-django(和graphene-django-optimizer)。

收到GraphQL查询后,数据库查询在几分之一秒内成功完成;然而,石墨烯在另外 10 多秒内不会发送响应。如果我增加响应中发送的数据,响应时间会线性增加(三倍数据 = 三倍响应时间)。

正在检索的数据由嵌套对象组成,最多 7 层深,但使用优化的查询,这不会影响从数据库检索数据所需的时间,因此我假设延迟与 graphene-python 有关将结果解析为 GraphQL 响应。

我无法弄清楚如何分析执行以确定花费这么长时间的时间——在 Django 上运行 cProfiler 似乎没有跟踪石墨烯的执行。

SQL Query 响应时间是使用 graphene-django-debugger 中间件确定的,结果如下所示:

    "_debug": {
  "sql": [
    {
      "duration": 0.0016078948974609375,
      "isSlow": false,
      "rawSql": "SELECT SYSDATETIME()"
    },
    {
      "duration": 0.0014908313751220703,
      "isSlow": false,
      "rawSql": "SELECT [redacted]"
    },
    {
      "duration": 0.0014371871948242188,
      "isSlow": false,
      "rawSql": "SELECT [redacted]"
    },
    {
      "duration": 0.001291036605834961,
      "isSlow": false,
      "rawSql": "SELECT [redacted]"
    },
    {
      "duration": 0.0013201236724853516,
      "isSlow": false,
      "rawSql": "SELECT [redacted]"
    },
    {
      "duration": 0.0015559196472167969,
      "isSlow": false,
      "rawSql": "SELECT …
Run Code Online (Sandbox Code Playgroud)

django graphql graphene-python graphene-django

11
推荐指数
1
解决办法
581
查看次数

如何使用使用不同类型的多个字段的 graphene-django 和 Relay 创建自定义过滤器?

问题

你好,

我在 Python 3.7 中使用 Graphene Django 和 Graphene Relay。我正在尝试使用 Django 过滤器为 GraphQL 中的请求创建一个自定义过滤器。

我的桌子看起来像这样:

| id(type: int) | flow(type: varchar) | datetime(type: datetime) | duration(type: int) |
|---------------|---------------------|--------------------------|---------------------|
| 1             | aaa                 | 2019-07-06 08:59:00      | 113095465           |
| 2             | xxx                 | 2019-07-06 08:59:00      | 113095465           |
| 3             | bbb                 | 2019-07-06 08:59:00      | 113095465           |
Run Code Online (Sandbox Code Playgroud)

我希望能够使用 GraphQL 执行这种 SQL 请求:

| id(type: int) | flow(type: varchar) | datetime(type: datetime) | duration(type: int) |
|---------------|---------------------|--------------------------|---------------------|
| …
Run Code Online (Sandbox Code Playgroud)

python django django-orm django-filter graphene-django

9
推荐指数
1
解决办法
1751
查看次数

如何有条件地记录 graphene-django 中的异常?

每当引发异常时,它们都会记录在控制台中(如果使用了 Sentry,则记录在 Sentry 中)。

许多这些例外仅旨在向用户显示。例如,django-graphql-jwt引发PermissionDenied异常login_required装饰

问题是这会在测试/开发期间污染控制台输出,并在生产期间将有效错误记录到 Sentry。对于上述示例等例外情况,它仅打算向用户显示,而不是记录。

作为一种解决方法,我尝试编写中间件来捕获抛出的任何异常:

class ExceptionFilterMiddleware:
    IGNORED_EXCEPTIONS = (
        # Local exceptions
        ValidationException,
        # Third-party exceptions
        JSONWebTokenExpired,
        PermissionDenied,
    )

    def on_error(self, error):
        if not isinstance(error, self.IGNORED_EXCEPTIONS):
            return error

    def resolve(self, next, *args, **kwargs):
        return next(*args, **kwargs).catch(self.on_error)
Run Code Online (Sandbox Code Playgroud)

但是如果异常被捕获或未返回,它不再填充errors查询/变异输出中的字段。因此,所有错误都被记录下来,没有办法有条件地记录异常。

这意味着唯一的解决方案是创建一个日志过滤器,如下所示:

def skip_valid_exceptions(record):
    """
    Skip exceptions for errors only intended to be displayed to the API user.
    """
    skip: bool = False

    if record.exc_info:
        exc_type, exc_value = …
Run Code Online (Sandbox Code Playgroud)

django graphene-python graphene-django

8
推荐指数
1
解决办法
1337
查看次数

Graphene-Django 和多对多关系查找

我有两个 Django 模型——老师和学生,并且有多对多的关系。老师可以有多个学生,学生也可以有多个老师。有一种称为“备注”的“通过”模型,教师可以在其中将学生标记为最喜欢的。

我是 GraphQL 的新手。我正在尝试实现两个查询:
1. 老师和他们所有的学生
2. 老师和他们最喜欢的学生

我在实施第二个查询时遇到了困难,并且一直无法这样做。

模型.py

SUBJECTS = (
    ("Maths", "Maths"),
    ("Chemistry", "Chemistry"),
    ("Physics", "Physics")
)

class Student(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField(default=0)

    def __str__(self):
        return self.name

class Teacher(models.Model):
    name = models.CharField(max_length=100)
    subject = models.CharField(max_length=100, choices=SUBJECTS)
    students = models.ManyToManyField(Student, through="Remarks")

    def __str__(self):
        return self.name

class Remarks(models.Model):
    student = models.ForeignKey(Student, related_name="student", on_delete=models.DO_NOTHING)
    teacher = models.ForeignKey(Teacher, related_name="teacher", on_delete=models.DO_NOTHING)
    favorite = models.BooleanField(default=False, choices=(
        (True, "Yes"),
        (False, "No")
    ))

Run Code Online (Sandbox Code Playgroud)

模式.py

import graphene
from graphene import relay, ObjectType …
Run Code Online (Sandbox Code Playgroud)

django graphql graphene-python graphene-django django-graphql-jwt

8
推荐指数
1
解决办法
1209
查看次数

如何使用 graphene-django 定义突变的自定义输出类型?

创建/删除/更新/删除(CRUD)突变通常返回相应的数据库模型实例作为突变的输出类型。然而,对于非 CRUD 突变,我想定义业务逻辑特定的突变输出类型。例如,返回列表元素的计数 + 不能在 graphql 类型和数据库模型之间一对一映射的 ID 列表。我怎样才能做到这一点graphene-django

python django graphql graphql-mutation graphene-django

8
推荐指数
1
解决办法
4282
查看次数

类型为 \"CreateUaction\" 的字段 \"createUaction\" 必须有一个子选择。"

这是我第一次使用石墨烯,对它没有很好的掌握。所以基本上是制作一个博客,用户可以在博客上点赞、评论和添加帖子到他最喜欢的,并互相关注。

我为所有用户操作制作了一个单独的模型

  class user_actions(models.Model):
      user = models.ForeignKey(User, on_delete=models.CASCADE)
      liked_post = models.ForeignKey(Post, related_name='post_likes', 
      on_delete=models.CASCADE)
      liked_comments = models.ForeignKey(Comment, 
      related_name='comment_likes', on_delete=models.CASCADE)
      fav = models.ForeignKey(Post, related_name='fav_post', 
      on_delete=models.CASCADE)
      target = models.ForeignKey(User, related_name='followers', 
      on_delete=models.CASCADE, null=True, blank = True)
      follower = models.ForeignKey(User, related_name='targets', 
      on_delete=models.CASCADE, null = True, blank = True)

      def __str__(self):
          return self.user.username
Run Code Online (Sandbox Code Playgroud)

因此,我对所有操作进行了更改,我正在尝试遵循 DRY 原则并将它们汇总在一起,我可能在这里做错了什么,新编码人员尽我所能:D

 class UactionInput(InputObjectType):
    liked_post_id = graphene.Int()
    fav_post_id = graphene.Int()
    comment_id = graphene.Int()
    target_id = graphene.Int()
    follower_id = graphene.Int()

 class CreateUaction(graphene.Mutation):
    user = graphene.Field(UactionType)

    class Arguments:
       input =  UactionInput()


    def mutate(self, info, …
Run Code Online (Sandbox Code Playgroud)

django graphql graphene-python graphene-django

7
推荐指数
1
解决办法
8211
查看次数

石墨烯错误消息

我想知道是否可以翻译石墨烯提供的验证错误消息?例如:“未提供身份验证凭据”,如下面的代码示例所示。

{
  "errors": [
    {
      "message": "Authentication credentials were not provided",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ]
    }
  ],
  "data": {
    "viewer": null
  }
}
Run Code Online (Sandbox Code Playgroud)

django graphql graphene-django

7
推荐指数
1
解决办法
5179
查看次数

如何在 Graphene Django 中记录有关 GraphQL 请求的信息?

目前,Django 记录:[16/Dec/2019 13:29:16] "POST /graphql HTTP/1.1" 200 1735对于任何传入的 graphql 请求。我希望能够记录有关传入请求的更多信息(它正在运行哪些查询、突变等)。

有没有标准化的方法来做到这一点,还是我应该编写自己的中间件?

django graphql graphene-python graphene-django

7
推荐指数
0
解决办法
328
查看次数

ImportError:无法从“django.utils.encoding”导入名称“force_text”(/usr/local/lib/python3.9/site-packages/django/utils/encoding.py)

当我在 settings.py 的INSTALLED_APPS中添加“graphene_django”时,出现以下错误。

运行后

python3 manage.py runserver
Run Code Online (Sandbox Code Playgroud)

graphene_django 已成功安装

pip install django graphene_django
Run Code Online (Sandbox Code Playgroud)

这是我得到的完整错误:

Watching for file changes with StatReloader
Exception in thread django-main-thread:
Traceback (most recent call last):
  File "/usr/local/Cellar/python@3.9/3.9.9/Frameworks/Python.framework/Versions/3.9/lib/python3.9/threading.py", line 973, in _bootstrap_inner
    self.run()
  File "/usr/local/Cellar/python@3.9/3.9.9/Frameworks/Python.framework/Versions/3.9/lib/python3.9/threading.py", line 910, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/local/lib/python3.9/site-packages/django/utils/autoreload.py", line 64, in wrapper
    fn(*args, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/django/core/management/commands/runserver.py", line 115, in inner_run
    autoreload.raise_last_exception()
  File "/usr/local/lib/python3.9/site-packages/django/utils/autoreload.py", line 87, in raise_last_exception
    raise _exception[1]
  File "/usr/local/lib/python3.9/site-packages/django/core/management/__init__.py", line 381, in execute
    autoreload.check_errors(django.setup)()
  File "/usr/local/lib/python3.9/site-packages/django/utils/autoreload.py", …
Run Code Online (Sandbox Code Playgroud)

python django python-3.x graphql graphene-django

7
推荐指数
1
解决办法
5866
查看次数