Python Flask安全性:如何在主py文件之外设置数据库?

Python Flask安全性:如何在主py文件之外设置数据库?,python,flask,flask-security,Python,Flask,Flask Security,我正在使用Flask Security 1.7.4和Flask 0.10.1 如果数据库方案存储在python文件app.py中,那么我运行我的网站没有问题: from flask.ext.security import RoleMixin, UserMixin, SQLAlchemyUserDatastore, Security from flask.ext.sqlalchemy import SQLAlchemy app = Flask(__name__) #Create databas

我正在使用Flask Security 1.7.4和Flask 0.10.1

如果数据库方案存储在python文件
app.py
中,那么我运行我的网站没有问题:

from flask.ext.security import RoleMixin, UserMixin, SQLAlchemyUserDatastore, Security
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)

#Create database connection object
db = SQLAlchemy(app)

#Define models
roles_users = db.Table('roles_users',
        db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
        db.Column('role_id', db.Integer(), db.ForeignKey('role.id')))

class Role(db.Model, RoleMixin):
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(80), unique=True)
    description = db.Column(db.String(255))

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(255), unique=True)
    companyid = db.Column(db.String(255), unique=True)
    lastname = db.Column(db.String(255))
    firstname = db.Column(db.String(255))
    password = db.Column(db.String(255))
    active = db.Column(db.Boolean())
    confirmed_at = db.Column(db.DateTime())
    roles = db.relationship('Role', secondary=roles_users,
                            backref=db.backref('users', lazy='dynamic'))

# Setup Flask-Security
user_datastore = SQLAlchemyUserDatastore(db, User, Role)
security = Security(app, user_datastore)
from flask.ext.security import RoleMixin, UserMixin, SQLAlchemyUserDatastore, Security
from flask.ext.sqlalchemy import SQLAlchemy
from security import db, user_datastore 

app = Flask(__name__)

#Initiate the database connection object
db.init_app(app)

# Setup Flask-Security
security = Security(app, user_datastore)
但是,我想分离更多代码,以便:

app_folder
|__ app.py  # Main file for the app
|__ security.py  # File that contain the database for the login/roles
所以我试着:

security.py
中:

db = SQLAlchemy()  

# Define models
roles_users = db.Table(
        'roles_users',
        db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
        db.Column('role_id', db.Integer(), db.ForeignKey('role.id'))
)

class Role(db.Model, RoleMixin):
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(80), unique=True)
    description = db.Column(db.String(255))

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(255), unique=True)
    companyid = db.Column(db.String(255), unique=True)
    lastname = db.Column(db.String(255))
    firstname = db.Column(db.String(255))
    password = db.Column(db.String(255))
    active = db.Column(db.Boolean())
    confirmed_at = db.Column(db.DateTime())
    roles = db.relationship('Role', secondary=roles_users, backref=db.backref('users', lazy='dynamic'))

user_datastore = SQLAlchemyUserDatastore(db, User, Role)
app.py
中:

from flask.ext.security import RoleMixin, UserMixin, SQLAlchemyUserDatastore, Security
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)

#Create database connection object
db = SQLAlchemy(app)

#Define models
roles_users = db.Table('roles_users',
        db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
        db.Column('role_id', db.Integer(), db.ForeignKey('role.id')))

class Role(db.Model, RoleMixin):
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(80), unique=True)
    description = db.Column(db.String(255))

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(255), unique=True)
    companyid = db.Column(db.String(255), unique=True)
    lastname = db.Column(db.String(255))
    firstname = db.Column(db.String(255))
    password = db.Column(db.String(255))
    active = db.Column(db.Boolean())
    confirmed_at = db.Column(db.DateTime())
    roles = db.relationship('Role', secondary=roles_users,
                            backref=db.backref('users', lazy='dynamic'))

# Setup Flask-Security
user_datastore = SQLAlchemyUserDatastore(db, User, Role)
security = Security(app, user_datastore)
from flask.ext.security import RoleMixin, UserMixin, SQLAlchemyUserDatastore, Security
from flask.ext.sqlalchemy import SQLAlchemy
from security import db, user_datastore 

app = Flask(__name__)

#Initiate the database connection object
db.init_app(app)

# Setup Flask-Security
security = Security(app, user_datastore)
我得到了以下错误:

File "C:\Work\pythonVirtualEnv\env02\lib\site-packages\sqlalchemy\engine\default.py", line 436, in do_execute
    cursor.execute(statement, parameters)
OperationalError: (OperationalError) no such table: users u'SELECT users.user_id AS users_user_id, users.username AS users_username, users.password AS users_password, users.email AS users_email, users.registered_on AS users_registered_on \nFROM users \nWHERE users.password = ? AND users.email = ?\n LIMIT ? OFFSET ?' (u'test', u'demo@demo.com', 1, 0)
问题是,如果我把所有的代码都保存在
app.py
中,它就能完美地工作。 当然,数据库是存在的

你能告诉我我做错了什么吗


谢谢:)

您应该使用不同的结构(和建议的结构):

在型号上,您保留应用程序型号 在安全方面,您保留您的安全模型 在视图上创建视图并公开URL

然后在init.py上

import logging
from flask import Flask
from flask.ext.appbuilder import SQLA
from flask.ext.appbuilder import AppBuilder
from sqlalchemy import SQLAlchemy

logging.basicConfig(format='%(asctime)s:%(levelname)s:%(name)s:%(message)s')
logging.getLogger().setLevel(logging.DEBUG)

app = Flask(__name__)
app.config.from_object('config')
db = SQLAlchemy(app)

from app import models, security, views
正在运行.py

from app import app

app.run(host='0.0.0.0', port=8080, debug=True)
希望这有帮助


看一看

嗨,谢谢你的回答,但它给出了相同的错误消息。我认为数据库没有正确初始化,但我不明白为什么。数据库上有用户表吗?嗨,是的,我有。如果我把所有的代码都放在主py文件中,它就可以正常工作了。在哪里可以解决这个问题?