我有两个模型,一个是标识,其中包含两个ID(first_id and second_id(,第二个是用户。这个想法是,只有授权用户将获得他们的第一个_id和second_id对值。他们进入网站并通过输入两个ID的加上用户名和密码(然后在此处生成(来登录。
。我试图在这里取得两件事:
用许多(例如100(first_id/second_id值预先填充标识表,该值将用作登录的正确值对。
以这样的方式设置用户类,只有用户在登录表单中输入正确的first_id/second_id对才能登录(可以认为这涉及以某种方式使用标识表检查表单数据(。
这是模型类:
class Identification(db.Model):
id = db.Column(db.Integer, primary_key=True)
first_id= db.Column(db.Text, unique=True)
second_id= db.Column(db.Text, unique=True)
def __init__(self, first_id, second_id):
self.first_id= first_id
self.second_id= second_id
def __repr__(self):
return f"ID: {self.id}, first_id: {self.first_id}, second_id: {self.second_id}"
class User(db.Model, UserMixin):
__tablename__ = 'user'
first_id= db.relationship('Identification', backref = 'identificationFID', uselist=False)
second_id = db.relationship('Identification', backref = 'identificationSID', uselist=False)
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.Text, unique=True, index=True)
password_hash = db.Column(db.Text(128))
identification_id = db.Column(db.Integer, db.ForeignKey('identification.id'), unique=True)
first_id = db.Column(db.Text, unique=True)
second_id = db.Column(db.Text, unique=True)
我很高兴为此提供任何帮助,因为我正在挣扎,这确实超出了我对Python/Flask的理解。谢谢所有!
上面的答案对我不起作用,因为create_tables()
功能自从是用户类的一部分以来,请求我通过该类的实例。我提出的解决方案是在db.create_all()
之后调用功能。由于@app.before_first_request
装饰师,这似乎是一个打电话的好地方。
init .py
@app.before_first_request
def create_tables():
"""Create Tables and populate certain ones"""
db.create_all()
from app.models.init_defaults import init_defaults
init_defaults()
init_defaults.py
def init_defaults():
"""Pre-Populate Role Table"""
if Role.query.first() is None:
roles = ['Admin', 'Master', 'Apprentice']
for role in roles:
user_role = Role(access_level=role)
if role != 'Apprentice':
user_role.set_password('Passw0rd!')
db.session.add(user_role)
db.session.commit()
pass
由于装饰器,该函数现在仅调用一次每个实例。我可以想象的另一个解决方案是使用事件:https://dzone.com/articles/how-to-initialize-database-with-default-values-in
注意:这是一种不适合生产的开发解决方案。
您可以使用模拟数据填充这些表。在此PY文件中创建一个函数,您可以在其中使用ORM添加对象然后在__init__.py中调用该函数,该功能将在烧瓶服务器启动后填充数据。
更新: -
这是您参考的代码。
model.py
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker
Base = declarative_base()
engine = create_engine('sqlite:///:memory:', echo=True)
Session = sessionmaker(bind=engine)
session = Session()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
fullname = Column(String)
#Create getter setters
def create_tables():
Base.metadata.create_all(engine)
user = User()
user.id=1
user.name="ABC"
user.fullname="ABCDEF"
session.add(user)
# similarly create more user objects with mock data and add it using session
__ init __。py
from model import User
User.create_tables()
参考