从父目录'__init__.py'文件导入python

时间:2018-04-29 14:05:53

标签: python flask import

我正在使用具有以下结构的烧瓶应用程序:

.
├── 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模块保留在当前目录中,因为目录结构很好,组织简洁。

提前致谢

编辑:澄清导入位置

1 个答案:

答案 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