我正在使用具有以下结构的烧瓶应用程序:
.
├── app
│ ├── __init__.py
│ ├── forms
│ │ └── login.py
│ ├── models
│ │ ├── __init__.py
│ │ └── user.py
│ ├── templates
│ │ ├── base.html
│ │ ├── home.html
│ │ └── login.html
│ └── views
│ ├── __init__.py
│ └── login.py
in 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
我现在需要在login
中导入app/models/user.py
才能提供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和谷歌上广泛搜索,但没有找到我的问题的直接答案。我想将user.py
模块保留在当前目录中,因为目录结构很好,组织简洁。
提前致谢
编辑:澄清导入位置
答案 0 :(得分:1)
您应该从LoginManager
函数中创建create_app
的实例。然后,您可以使用init_app
方法将其配置为登录。
from flask import Flask
from flask-login import LoginManager
login_manager = LoginManager()
def create_app(config):
app = Flask(__name__)
login_manager.init_app(app)
return app