Flask-Migrate “ModuleNotFoundError”

僤鯓⒐⒋嵵緔 提交于 2019-12-24 18:31:20

问题


I'm trying to make migrations on my Flask api based on SQLite db. Here is my project structure

├── app.py
├── blueprints
├── conf.py
├── db.sqlite
├── __init__.py
├── migrations
├── models.py
└── templates

Then i initialize my migrate class in the app.py

from flask import Flask, jsonify, request, render_template
from flask_sqlalchemy import SQLAlchemy

from conf import ErrorResponses, SuccessResponses

# initialization
app = Flask(__name__)
db = SQLAlchemy(app)
from models import User, db, BlackListToken

# extensions
from flask_migrate import Migrate
mig = Migrate(app, db)

But it fails on importing from custom modules while flask db migrate -m "rm id and made name/surname nullable".

Usage: flask db migrate [OPTIONS]

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

Traceback (most recent call last):
  File "/usr/local/lib/python3.6/dist-packages/flask/cli.py", line 235, in locate_app
    __import__(module_name)
  File "/home/zahessi/all/bubbie_D/api_flask/app.py", line 9, in <module>
    from conf import ErrorResponses, SuccessResponses
ModuleNotFoundError: No module named 'conf'

Here is how models.py looks:

from app import db

class User(db.Model):
    __tablename__ = 'users'

    username = db.Column(db.String(32), index=True, unique=True, nullable=False)
    email = db.Column(db.String(64), unique=True, nullable=False)
    password_hash = db.Column(db.String(64), nullable=False)
    name = db.Column(db.String(32))
    surname = db.Column(db.String(32))
    public_id = db.Column(db.String(32))
    creation_date = db.Column(db.DateTime)
    ...

When I remove all imports from custom py files, all seems to work, however, this is a lot of unnecessary work. Do you have any suggestions why does it work in that way?

UPD: Added conf.py. It fails on every local import, on blueprints as well, depending on the order of the imports.

from re import findall

class ErrorResponses:
    usernameOrPasswordBlank = {
        "success": False,
        "error": "Username and password cannot be blank."
    }
    userAlreadyExists = {"success": False, "error": "Such user already exists"}
    incorrectData = {
        "success": False,
        "error": "Incorrect username or password"
    }
    invalidData = {
        "success": False,
        "error": "Username or password is invalid"
    }
    noUser = {
        "success": False,
        "error": "There is no user with such username or public_id"
    }
    ...

回答1:


To solve your problem I will suggest using flask_script instead flask cli. Simply create manage.py file in your root directory and then do as follows:

from flask_migrate import Migrate, MigrateCommand
from flask_script import Manager
migrate = Migrate(app, db)
manager = Manager(app)
manager.add_command('db', MigrateCommand)

To launch migration simply do: python manage.py db migrate or python3 manage.py migrate (depends on your PATH configuration)




回答2:


I can see that you solved the problem, but I want to show you the simpler solution than installing flask-script and creating manage.py file. You just have to delete __init__.py file that is at the same level as app.py file. It solved the problem for me. Cheers :)



来源:https://stackoverflow.com/questions/51925284/flask-migrate-modulenotfounderror

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!