我正在使用 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)
有人遇到过类似的问题吗?可以看看我使用的版本吗?谢谢
目前使用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) 你好,
我在 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) 每当引发异常时,它们都会记录在控制台中(如果使用了 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 模型——老师和学生,并且有多对多的关系。老师可以有多个学生,学生也可以有多个老师。有一种称为“备注”的“通过”模型,教师可以在其中将学生标记为最喜欢的。
我是 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
创建/删除/更新/删除(CRUD)突变通常返回相应的数据库模型实例作为突变的输出类型。然而,对于非 CRUD 突变,我想定义业务逻辑特定的突变输出类型。例如,返回列表元素的计数 + 不能在 graphql 类型和数据库模型之间一对一映射的 ID 列表。我怎样才能做到这一点graphene-django?
这是我第一次使用石墨烯,对它没有很好的掌握。所以基本上是制作一个博客,用户可以在博客上点赞、评论和添加帖子到他最喜欢的,并互相关注。
我为所有用户操作制作了一个单独的模型
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) 我想知道是否可以翻译石墨烯提供的验证错误消息?例如:“未提供身份验证凭据”,如下面的代码示例所示。
{
"errors": [
{
"message": "Authentication credentials were not provided",
"locations": [
{
"line": 2,
"column": 3
}
]
}
],
"data": {
"viewer": null
}
}
Run Code Online (Sandbox Code Playgroud) 目前,Django 记录:[16/Dec/2019 13:29:16] "POST /graphql HTTP/1.1" 200 1735对于任何传入的 graphql 请求。我希望能够记录有关传入请求的更多信息(它正在运行哪些查询、突变等)。
有没有标准化的方法来做到这一点,还是我应该编写自己的中间件?
当我在 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)