我正在处理一个我想要添加用户模型的应用程序。传统上,应用程序是通过python3 runserver.py
启动的,但我需要一种创建管理员的机制,所以我添加了这个功能:
def create_admin():
username = input("Please enter username: ")
# "select * from user where user.username = username;"
q = db.session.query(User).filter(User.username == username)
# if that user exists, don't create it
if db.session.query(q.exists()).scalar():
print("User already exists. Exiting.", file=sys.stderr)
sys.exit(1)
# otherwise, create it and commit to db
password = getpass.getpass("Please enter password (it will not be echoed): ")
admin = User(username, password=password, admin=True)
db.session.add(admin)
db.session.commit()
这将从项目foo
导入,其__init__.py
看起来像这样:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_socketio import SocketIO
from flask.ext.login import LoginManager
import tempfile
import os
app = Flask(__name__)
sqllite_uri = os.path.join('sqlite:///{}'.format(tempfile.gettempdir()), 'test.db')
app.config['SQLALCHEMY_DATABASE_URI'] = sqllite_uri
db = SQLAlchemy(app)
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login'
socketio = SocketIO(app)
from foo.models import create_admin
from foo import views, models
问题是这些表是作为runserver.py
的一部分在__main__
内创建的,因此当我从命令行调用create_admin
时,表格不会被删除存在。
我将db.create_all()
作为create_admin()
中的第一行有效,但如果我需要创建多个管理员,则会失败。这告诉我用户模型没有任何问题。此外,这使我认为在第一次导入foo
时创建表格会更好。
我尝试在db.create_all()
内创建db
对象后直接添加__init__.py
,但我仍然从我的create_admin
调用中获得例外,因为我的用户表格没有&#39}存在。 db.create_all()
目前还不知道这些表格,这让我觉得我需要导入模型。
有没有办法在__init__.py
中创建我忽略的表格?可能foo.model
中的表格在创建db
时未被查看,但我无法弄清楚如何在__init__.py
中导入模型。< / p>
python3 runsersever.py
创建表格答案 0 :(得分:0)
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_socketio import SocketIO
from flask.ext.login import LoginManager
import tempfile
import os
app = Flask(__name__)
sqllite_uri = os.path.join('sqlite:///{}'.format(tempfile.gettempdir()), 'test.db')
app.config['SQLALCHEMY_DATABASE_URI'] = sqllite_uri
db = SQLAlchemy(app)
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login'
socketio = SocketIO(app)
from foo.models import create_admin
from foo import views, models
db.create_all()
当我们准备创建表格时(即通过调用db.create_all()
),所有表格都是已知的,因为模型已从foo
导入。
这可能不是这样做的惯用方式,但我会将其发布给未来的用户。我仍然愿意接受更好的选择!