MeWrite Docs

ImportError: cannot import name from flask

Flaskモジュールからインポートできない場合に発生するエラー

概要

ImportError: cannot import name 'xxx' from 'flask' は、FlaskまたはFlask拡張機能からモジュールやクラスをインポートできない場合に発生するエラーです。バージョンの不一致、インストールの問題、循環インポートなどが原因です。

エラーメッセージ

ImportError: cannot import name 'escape' from 'flask'
ImportError: cannot import name 'Markup' from 'flask'
ImportError: cannot import name 'json' from 'flask'

原因

  1. Flask バージョンの変更: Flask 2.3 以降で一部のインポートが変更
  2. パッケージ未インストール: Flask や拡張がインストールされていない
  3. 循環インポート: モジュール間の循環参照
  4. 仮想環境の問題: 仮想環境が正しくアクティブ化されていない
  5. ファイル名の競合: flask.py という名前のファイルがある

解決策

1. Flask 2.3+ での変更に対応

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# Flask 2.2 以前
from flask import escape, Markup

# Flask 2.3 以降
from markupsafe import escape, Markup

# Flask の json モジュール
# Flask 2.2 以前
from flask import json

# Flask 2.3 以降(まだ使用可能だが、直接使用を推奨)
import json
# または
from flask.json import dumps, loads

2. 依存パッケージをインストール

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# Flask をインストール
pip install flask

# 最新版にアップグレード
pip install --upgrade flask

# MarkupSafe をインストール
pip install markupsafe

# requirements.txt を作成
pip freeze > requirements.txt

3. Flask 拡張機能のインストール

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# Flask-SQLAlchemy
pip install flask-sqlalchemy

# Flask-Login
pip install flask-login

# Flask-WTF
pip install flask-wtf

# Flask-CORS
pip install flask-cors

# Flask-Migrate
pip install flask-migrate

4. 循環インポートの解決

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# ❌ 循環インポートの例
# app.py
from flask import Flask
from models import User  # models.py が app.py をインポート

app = Flask(__name__)

# models.py
from app import app  # 循環!
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# ✅ 解決策: アプリケーションファクトリパターン
# extensions.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

# models.py
from extensions import db

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100))

# app.py
from flask import Flask
from extensions import db

def create_app():
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'

    db.init_app(app)

    with app.app_context():
        from models import User  # ここでインポート
        db.create_all()

    return app

app = create_app()

5. 仮想環境の確認

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 仮想環境を作成
python -m venv venv

# アクティブ化 (Linux/macOS)
source venv/bin/activate

# アクティブ化 (Windows)
venv\Scripts\activate

# Flask がインストールされているか確認
pip list | grep -i flask

# 再インストール
pip uninstall flask
pip install flask

6. ファイル名の競合を解消

1
2
3
4
5
6
7
8
9
# flask.py という名前のファイルがないか確認
ls *.py | grep flask

# flask.py がある場合はリネーム
mv flask.py myapp.py

# __pycache__ も削除
rm -rf __pycache__
rm -rf *.pyc

7. 正しいインポート文

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# Flask の基本的なインポート
from flask import Flask, request, jsonify, render_template, redirect, url_for

# Flask-SQLAlchemy
from flask_sqlalchemy import SQLAlchemy

# Flask-Login
from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required

# Flask-WTF
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Email

# Flask-CORS
from flask_cors import CORS

8. Python パスの確認

1
2
3
4
5
6
7
# Python のパスを確認
import sys
print(sys.path)

# Flask のインストール場所を確認
import flask
print(flask.__file__)

9. 型ヒントのインポート

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# Flask 2.0+ での型ヒント
from flask import Flask
from flask.typing import ResponseReturnValue

def index() -> ResponseReturnValue:
    return "Hello"

# Request と Response の型
from flask import Request, Response

def process_request(request: Request) -> Response:
    return Response("OK")

10. Blueprints でのインポート

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# blueprints/auth.py
from flask import Blueprint, render_template, redirect, url_for

auth_bp = Blueprint('auth', __name__, url_prefix='/auth')

@auth_bp.route('/login')
def login():
    return render_template('login.html')

# app.py
from flask import Flask
from blueprints.auth import auth_bp

app = Flask(__name__)
app.register_blueprint(auth_bp)

Docker での対処

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# Dockerfile
FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["python", "app.py"]
# requirements.txt
flask>=2.3.0
flask-sqlalchemy>=3.0.0
markupsafe>=2.1.0

デバッグのコツ

バージョン確認

1
2
3
4
5
import flask
print(flask.__version__)

import markupsafe
print(markupsafe.__version__)

インポート可能なものを確認

1
2
3
4
5
import flask
print(dir(flask))

# 特定の属性を確認
hasattr(flask, 'escape')  # False (Flask 2.3+)

依存関係の確認

1
2
3
# 依存関係ツリー
pip install pipdeptree
pipdeptree -p flask

Flask の他のエラー

最終更新: 2025-12-08