从 Flask 项目同一目录中的 __init__ 导入

Importing from __init__ in flask project same directory

init.py和models.py在同一个目录下(myproject)

myproject
 |
 -- __init__.py
 -- models.py
 |
 app.py

当我尝试从 init 导入 models.py 中的内容时,我得到:

ModuleNotFoundError: No module named 'myproject'

我的尝试:

from myproject import db,login_manager

当 init(例如数据库)与其他 .py 文件位于同一目录中时,如何从它导入某些内容?

内部初始化:

import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_login import LoginManager


login_manager = LoginManager()

app = Flask(__name__)

app.config['SECRET_KEY'] = 'mysecretkey'
basedir = os.path.abspath(os.path.dirname(__file__))
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + 
os.path.join(basedir, 'data.sqlite')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)
Migrate(app,db)

login_manager.init_app(app)

login_manager.login_view = "login"

里面 models.py:

from myproject import db,login_manager
from werkzeug.security import 
generate_password_hash,check_password_hash
from flask_login import UserMixin

@login_manager.user_loader
def load_user(user_id):
    return User.query.get(user_id)

class User(db.Model, UserMixin):


    __tablename__ = 'users'


    id = db.Column(db.Integer, primary_key = True)
    email = db.Column(db.String(64), unique=True, index=True)
    username = db.Column(db.String(64), unique=True, index=True)
    password_hash = db.Column(db.String(128))

    def __init__(self, email, username, password):
        self.email = email
        self.username = username
        self.password_hash = generate_password_hash(password)

    def check_password(self,password):

        return check_password_hash(self.password_hash,password)

在 app.py 内部(我从那里执行我的项目 - 它也可以工作)只是想知道为什么 models.py 中的导入会输出错误消息

from myproject import app,db
from flask import render_template, redirect, request, url_for, 
flash,abort
from flask_login import login_user,login_required,logout_user
from myproject.models import User
from myproject.forms import LoginForm, RegistrationForm
from werkzeug.security import generate_password_hash, 
check_password_hash


@app.route('/')
def home():
    return render_template('home.html')

-- (some more view functions) --





if __name__ == '__main__':
    app.run(debug=True)

使用.从同一级别导入。

from . import db, login_manager

您需要设置 PYTHONPATH 以便 model.py 可以找到我的项目模块。

如果你是 运行 flask shell,请在我的项目目录中尝试以下操作

export PYTHONPATH=.
flask shell

参考:https://docs.python.org/2/using/cmdline.html#envvar-PYTHONPATH