импорт python из файла родительских каталогов '__init__.py' - PullRequest
0 голосов
/ 29 апреля 2018

Я работаю над приложением для колб со следующей структурой:

.
├── 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 и Google, но не нашел прямого ответа на мой вопрос. Я хотел бы сохранить модуль user.py в текущем каталоге, так как структура каталога удобна и лаконична.

Заранее спасибо

редактировать: уточненное место импорта

1 Ответ

0 голосов
/ 29 апреля 2018

Вы должны создать экземпляр функции 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...