【问题标题】:Flask-migrate can't find custom modulesFlask-migrate 找不到自定义模块
【发布时间】:2023-03-09 11:33:01
【问题描述】:

我对我的 SQLAlchemy 模型进行了一些更改,我想将它们迁移到我的数据库中。当我尝试迁移时,我收到以下错误:

$ flask db migrate
Usage: flask db migrate [OPTIONS]

Error: While importing "minerva.dashboard.app", an ImportError was raised:

Traceback (most recent call last):
  File "/home/mattfred/Minerva/envs/dashboard/lib/python3.7/site-packages/flask/cli.py", line 235, in locate_app
    __import__(module_name)
  File "/home/mattfred/Minerva/minerva/dashboard/app.py", line 13, in <module>
    from templates.nav_layout import *
ModuleNotFoundError: No module named 'templates'

我不知道自从我第一次初始化数据库以来发生了什么变化,除了将视图移动到单独的文件而不是 1。

我实际上可以通过将导入语句更改为来解决这个问题

from .templates.nav_layout import *

但在尝试运行应用程序时出现此错误:

Traceback (most recent call last):
  File "app.py", line 13, in <module>
    from .templates.nav_layout import *
ModuleNotFoundError: No module named '__main__.templates'; '__main__' is not a package

我已经尝试过这里提供的解决方案:Flask-Migrate "ModuleNotFoundError"

但是运行没有错误并且不会改变我的数据库。

如果我删除该行,它只会移动到下一个模板文件,然后是 Config 文件,所以我认为模板文件没有任何问题。

# app.py
import os

from flask import Flask, redirect
from flask_login import login_required, LoginManager
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_socketio import SocketIO, emit, disconnect

from werkzeug.wsgi import DispatcherMiddleware

from dash import Dash

from templates.nav_layout import *
from templates.dash_app_layout import *

from Config import Config, DEBUG

# Setup the Flask server
server = Flask(__name__)
server.config.from_object(Config)

db = SQLAlchemy(server)
migrate = Migrate(server, db)

@server.shell_context_processor
def make_shell_context():
    from Models import Users, Company
    return {'db': db, 'Users': Users, 'Company': Company}

我相当肯定这与项目结构有关

├── app.py
├── Config.py
├── Forms.py
├── __init__.py
├── manage.py
├── migrations/
├── Models.py
├── requirements.txt
├── templates
│   ├── change_profile.html
│   ├── dash_app_layout.py
│   ├── default_login.html
│   ├── default_logout.html
│   ├── _formhelpers.html
│   ├── header.html
│   ├── index.html
│   ├── __init__.py
│   ├── nav_layout.py
│   ├── record_meeting.html
│   ├── register_user.html
│   ├── upload_meeting.html
│   └── voice_enroll.html
├── utils
│   ├── audio_processor
│   │   ├── AudioProcessor.py
│   │   ├── audio_type_converter.py
│   │   ├── Deidentifier.py
│   │   ├── Identification
│   │   │   ├── CreateProfile.py
│   │   │   ├── DeleteProfile.py
│   │   ├── __init__.py
│   │   ├── Utterance.py
│   │   └── voice_enroll.py
│   ├── db_operations.py
│   ├── __init__.py
│   ├── interim_result_processor.py
│   └── utils.py
└── views
    ├── auth.py
    ├── dash_callbacks.py
    ├── __init__.py
    ├── meeting_upload.py
    ├── profile.py
    └── record_meeting.py

【问题讨论】:

  • 您当前的目录是什么?您提供的文件结构中没有任何名为minerva/dashboard/app.py 的内容。我认为您缺少父目录。请提供完整的结构。
  • 我展示的精细结构来自仪表板。 Minerva 有两个不相关的独立 web 应用程序。它不是项目的一部分。 App.py 等都在仪表板文件夹中,并且没有除此之外的依赖项(环境除外)。
  • 我重复我的问题。你当前的目录是什么?还有一个问题:FLASK_APP 环境变量的值是多少?
  • 我的当前目录是/home/mattfred/Minerva/minerva/dashboard,因为在app.py 中是/home/mattfred/Minerva/minerva/dashboard/app.pyFLASK_APP=app.py。感谢您的帮助!
  • 我不明白为什么错误消息提到“minerva.dashboard.app”。如果您从仪表板目录中开始,它如何知道 minerva 和仪表板父级?您是否有自定义 PYTHONPATH 设置?

标签: python flask sqlalchemy flask-sqlalchemy flask-migrate


【解决方案1】:

根据 cmets 中的讨论,问题在于顶级目录有一个 __init__.py 文件。删除该文件解决了奇怪的导入行为。

【讨论】:

    猜你喜欢
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多