导入错误:无法从其危险中导入名称“json”

Kro*_*077 70 python flask docker docker-compose

我正在尝试让 Flask 和 Docker 应用程序正常工作,但是当我尝试docker-compose up在 Visual Studio 终端中使用命令运行它时,它给了我一个名为ImportError: cannot import name 'json' from itsdangerous. 我试图寻找解决这个问题的可能解决方案,但到目前为止,这里或其他地方的解决方案并不多。我能找到的唯一两个解决方案是将 MarkupSafe 及其危险的当前安装更改为更高版本:https://serverfault.com/questions/1094062/from-itsdangerous-import-json-as-json-importerror-cannot- import-name-json-fr和 GitHub 上的另一个告诉我从本质上再次更改 MarkUpSafe 及其危险的安装https://github.com/aws/aws-sam-cli/issues/3661,我也尝试过命名为安装软件包的虚拟环境veganetworkscriptenv,但也失败了。我目前使用 Flask 2.0.0 和 Docker 5.0.0,错误发生在 vegamain.py 的第八行。

这是我尝试运行该程序时收到的完整导入错误:

veganetworkscript-backend-1  | Traceback (most recent call last):
veganetworkscript-backend-1  |   File "/app/vegamain.py", line 8, in <module>
veganetworkscript-backend-1  |     from flask import Flask
veganetworkscript-backend-1  |   File "/usr/local/lib/python3.9/site-packages/flask/__init__.py", line 19, in <module>
veganetworkscript-backend-1  |     from . import json
veganetworkscript-backend-1  |   File "/usr/local/lib/python3.9/site-packages/flask/json/__init__.py", line 15, in <module>
veganetworkscript-backend-1  |     from itsdangerous import json as _json
veganetworkscript-backend-1  | ImportError: cannot import name 'json' from 'itsdangerous' (/usr/local/lib/python3.9/site-packages/itsdangerous/__init__.py)
veganetworkscript-backend-1 exited with code 1
Run Code Online (Sandbox Code Playgroud)

这是我的requirements.txt、vegamain.py、Dockerfile 和 docker-compose.yml 文件:

要求.txt:

Flask==2.0.0
Flask-SQLAlchemy==2.4.4
SQLAlchemy==1.3.20
Flask-Migrate==2.5.3
Flask-Script==2.0.6
Flask-Cors==3.0.9
requests==2.25.0
mysqlclient==2.0.1
pika==1.1.0
wolframalpha==4.3.0
Run Code Online (Sandbox Code Playgroud)

vegamain.py:

# Veganetwork (C) TetraSystemSolutions 2022
# all rights are reserved.  
# 
# Author: Trevor R. Blanchard Feb-19-2022-Jul-30-2022
#

# get our imports in order first
from flask import Flask # <-- error occurs here!!!

# start the application through flask.
app = Flask(__name__)

# if set to true will return only a "Hello World" string.
Debug = True

# start a route to the index part of the app in flask.
@app.route('/')
def index():
    if (Debug == True):
        return 'Hello World!'
    else:
        pass

# start the flask app here --->
if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0') 
Run Code Online (Sandbox Code Playgroud)

Dockerfile:

FROM python:3.9
ENV PYTHONUNBUFFERED 1
WORKDIR /app
COPY requirements.txt /app/requirements.txt
RUN pip install -r requirements.txt
COPY . /app
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml:

version: '3.8'
services:
  backend:
    build:
      context: .
      dockerfile: Dockerfile
    command: 'python vegamain.py'
    ports:
      - 8004:5000
    volumes:
      - .:/app
    depends_on:
      - db

#  queue:
#    build:
#      context: .
#      dockerfile: Dockerfile
#    command: 'python -u consumer.py'
#    depends_on:
#      - db

  db:
    image: mysql:5.7.22
    restart: always
    environment:
      MYSQL_DATABASE: admin
      MYSQL_USER: root
      MYSQL_PASSWORD: root
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - .dbdata:/var/lib/mysql
    ports:
      - 33069:3306
Run Code Online (Sandbox Code Playgroud)

我究竟该如何修复此代码?谢谢你!

小智 69

导入失败似乎与该包的最新发行版本有关itsdangerous在这里查看最新版本

itsdangerous==2.0.1就我而言,我通过在文件中显式添加包依赖项来使其工作requirements.txt

要使更改生效,请更新您的虚拟环境以反映新的requirements.txt.

  • 也为我工作过。它打破了“itsdangerous==2.1.0” (2认同)

小智 34

我只是放入了我的requirements.txt。然后使用然后itsdangerous==2.0.1更新了我的virtualenv 。现在对我来说一切都很好。没有升级flask版本。pip install -r requirements.txtdocker-compose up --build


Sri*_*hna 23

解决方案 1 - 将 Flask 升级到最新版本,即 2.0.1 或更高版本。这是解决问题的推荐方法。

\n
pip install Flask==2.0.1\n
Run Code Online (Sandbox Code Playgroud)\n

或者

\n
pip install Flask==2.1.0\n
Run Code Online (Sandbox Code Playgroud)\n

解决方案2 - 由于很难在短时间内升级到最新版本的Flask,您可以尝试以下方法来解决该问题。

\n

您可以继续使用 Flask 版本 1.1.2 并尝试将 itdangerous 降级到 2.0.1。您可以通过添加itsdangerous==2.0.1到requirements.txt 文件来完成此操作。

\n

解决方案 3 - 另一种方法是将 Flask 从 1.1.2 升级到 1.1.4,因为它没有突破性的更改,并将markupsafe库降级到 2.0.1

\n

从 Flask 1.1.2 升级到 1.1.4 后,您将面临另一个问题,即ImportError: Cannot import name \xe2\x80\x98soft_unicode\xe2\x80\x99 from \xe2\x80\x98markupsafe\xe2\x80\x99在版本 1.38.0 #3661 中,可以通过将 markupsafe 降级到版本 2.0.1 来修复,如下所示。

\n
pip install Flask==1.1.4\npip install markupsafe==2.0.1\n
Run Code Online (Sandbox Code Playgroud)\n

参考 - [已解决] ImportError: 无法从 itsdangerous 导入名称 \xe2\x80\x98json\xe2\x80\x99

\n


小智 9

将 ItstooDangerous 降级到较低版本以支持烧瓶。

pip3 install itsdangerous==2.0.1
Run Code Online (Sandbox Code Playgroud)


Har*_*ini 5

我在使用 Flask 运行 docker 容器时遇到了同样的问题。

我降级Flask1.1.4并解决markupsafe2.0.1我的问题。

检查以供参考。


Chr*_*iep 5

此问题的根源似乎是 Flask 2.0.0 不受支持。尝试使用最新版本的 Flask。

https://github.com/pallets/itsdangerous/issues/289

截至2022年3月8日,最新版本为2.0.3:

pip install Flask=2.0.3
Run Code Online (Sandbox Code Playgroud)

请参阅Github 上的 Flask 源代码以获取最新版本。


joe*_*ler 5

添加itsdangerous==2.0.1到我的requirements.txt文件,并降级以Flask==1.1.1修复它。