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

Ger*_*erd 50 python django python-3.x graphql graphene-django

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

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

Osm*_*man 83

在 django 4.0 中我们没有force_text

https://docs.djangoproject.com/en/4.0/ref/utils/#module-django.utils.encoding

改为force_textforce_str

linux:

YOUR_VENV/lib/PYTHON_VERSION/site-packages/graphene_django/utils/utils.py

视窗:

YOUR_VENV/lib/site-packages/graphene_django/utils/utils.py

from django.utils.encoding import force_text
Run Code Online (Sandbox Code Playgroud)

from django.utils.encoding import force_str
Run Code Online (Sandbox Code Playgroud)

def _camelize_django_str(s):
    if isinstance(s, Promise):
        s = force_text(s)
    return to_camel_case(s) if isinstance(s, six.string_types) else s
Run Code Online (Sandbox Code Playgroud)

def _camelize_django_str(s):
    if isinstance(s, Promise):
        s = force_str(s)
    return to_camel_case(s) if isinstance(s, six.string_types) else s
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的回答。我可以在 venv 中本地更改它,但这不是一个有效的解决方案,因为我正在部署到云,并且 venv 将在目标上创建。 (9认同)

Bla*_*aze 32

基于@Osman 给出的答案。

该问题似乎发生在 Django-4 上。在PR合并之前,这个猴子补丁可能会起作用(未在产品中测试):

import django
from django.utils.encoding import force_str
django.utils.encoding.force_text = force_str
Run Code Online (Sandbox Code Playgroud)

将其放入入口文件中。我暂时将其保留在settings.py 中。

  • 入口文件(入口点)可以是首先调用以旋转整个应用程序的任何内容。就我而言,我使用了settings.py。想法是在被其他任何东西调用之前更改导入的对象。 (2认同)
  • 这是一个 hacky 但更干净的解决方法!更干净,因为升级“graphene_django”不需要任何后续更改。Hacky 因为在运行时更改类属性被认为是一种 hack。 (2认同)

小智 14

在 Django 版本 4> 中,只需将此代码片段粘贴到您的settingsg.py 中。最好是在顶部

    import django
    from django.utils.encoding import force_str
    django.utils.encoding.force_text = force_str
Run Code Online (Sandbox Code Playgroud)


小智 12

force_text已从Django 4.0中删除,但旧版本的graphene_django仍在. *您可以看到4.0 中删除的功能force_textutils.py

因此,升级graphene-django可以轻松解决该错误:

pip install graphene-django --upgrade
Run Code Online (Sandbox Code Playgroud)

或者,替换force_textforce_str如下所示:

# "utils.py"

# from django.utils.encoding import force_text # Line 6
from django.utils.encoding import force_str # Line 6

# s = force_text(s) # Line 29
s = force_str(s) # Line 29
Run Code Online (Sandbox Code Playgroud)

这些是LinuxWindowsutils.py的路径:

Linux:

<your_venv>/lib/<python_version>/site-packages/graphene_django/utils/utils.py

视窗:

<your_venv>/lib/site-packages/graphene_django/utils/utils.py