Попытка реализовать flask-security

Я пытаюсь создать скелет и использую безопасность фляги для входа в систему/администратора.

В папке моего приложения у меня есть функция, в которой я создаю свое приложение:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_security import Security, SQLAlchemyUserDatastore

from .views.home import home_blueprint
from .views.contact import contact_blueprint
from .views.login import login_blueprint, bcrypt, login_manager
from .models import db
from .models.user import User, Role

def create_app():
    app = Flask(__name__, instance_relative_config=True)
    db.init_app(app)
    bcrypt.init_app(app)
    login_manager.init_app(app)
    app.register_blueprint(home_blueprint)
    app.register_blueprint(contact_blueprint)
    app.register_blueprint(login_blueprint)
    app.config.from_object('config')
    user_datastore = SQLAlchemyUserDatastore(db, User, Role)
    security = Security(app, user_datastore)
    return app

Теперь проблема возникает, когда я пытаюсь создать фиктивного пользователя-администратора для тестирования. Для этого у меня есть файл create_db.py в корневой папке скелета.

from app import create_app
from sqlalchemy import exists
from flask_security.utils import encrypt_password

from app.models import db
from app.models.user import Role, User

create_app().app_context().push()
db.create_all()

user_role = Role(name='user')
db.session.add(user_role)
db.session.commit()

super_user_role = Role(name='superuser')
db.session.add(super_user_role)
db.session.commit()

user_role = Role(name='user')
super_user_role = Role(name='superuser')
admin_user = user_datastore.create_user(
    username='admin',
    email='admin',
    password=encrypt_password('admin'),
    confirmed_at=datetime.datetime.now(),
    roles=[user_role, super_user_role]
)
db.session.commit()

Когда я запускаю это, я получаю NameError: user_datastore не определен?

Для истории я сначала внедрил flask-login и смог создать базу данных.


person spitfiredd    schedule 02.05.2017    source источник


Ответы (1)


В файле create_db.py переменная user_datastore не существует, отсюда и ошибка. Вы можете сделать что-то вроде следующего в create_dy.py (не проверено):

app = create_app()
app.app_context().push()
# get the app security instance
security = app.extensions.get('security')
# or like this
# security = app.extensions['security']


# ... etc

# Use the security api to create users
admin_user = security.datastore.create_user(
    username='admin',
    email='admin',
    password=encrypt_password('admin'),
    confirmed_at=datetime.datetime.now(),
    roles=[user_role, super_user_role]
)

# ... etc

Также я не уверен, что вам нужно login_manager.init_app(app) в вашей функции create_app().

person pjcunningham    schedule 03.05.2017
comment
Эта часть кода полностью открыла для меня мир flask-security; security = app.extensions.get('security') - person Jeff Bluemel; 08.04.2018