【问题标题】:python import from parent directories '__init__.py' filepython 从父目录导入'__init__.py'文件
【发布时间】: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
  • 我的错,我描述的措辞很糟糕。我需要从应用目录导入,而不是模型目录。

标签: python flask import


【解决方案1】:

您应该使用create_app 函数创建LoginManager 的实例。然后你可以配置它使用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

【讨论】:

  • 你,先生,是一个活生生的救星。它就像一个魅力。非常感谢
猜你喜欢
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 2018-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多