【发布时间】:2018-10-09 18:39:22
【问题描述】:
我正在开发一个具有以下结构的烧瓶应用程序:
.
├── app
│ ├── __init__.py
│ ├── forms
│ │ └── login.py
│ ├── models
│ │ ├── __init__.py
│ │ └── user.py
│ ├── templates
│ │ ├── base.html
│ │ ├── home.html
│ │ └── login.html
│ └── views
│ ├── __init__.py
│ └── login.py
在app/__init__.py 我正在创建一个 LoginManager 扩展的实例:
from flask import Flask
from config import app_config
from flask_login import LoginManager
def create_app(config_mode='development'):
"""Wrapping app creation in factory according to specified config."""
app = Flask(__name__, template_folder='templates')
...
# register login manager extension
login = LoginManager(app)
return app
我现在需要在app/models/user.py 中导入login 以提供user_loader 实现:
from flask_sqlalchemy import SQLAlchemy
from flask_login import UserMixin
from . import db
from .. import login
class User(UserMixin, db.Model):
"""User model."""
...
@login.user_loader
def load_user(id):
return User.query.get(int(id))
但是,任何这样做的尝试都会失败:
from .. import login
ImportError: cannot import name 'login'
我的问题是:有什么方法可以从父目录__init__.py 文件导入,还是我在这里犯了其他错误?
我尝试了多种绝对和相对导入的不同组合,但都产生了相同的结果,并在 SO 和 google 上进行了广泛搜索,但没有找到我问题的直接答案。我想将user.py 模块保留为当前目录,因为目录结构很好且组织简洁。
提前致谢
编辑:明确导入位置
【问题讨论】:
-
..上升而不是下降。使用from app.models import login -
我的错,我描述的措辞很糟糕。我需要从应用目录导入,而不是模型目录。