我有一个名为Person的ORM类,它包含一个person表:
在设置与db等的连接之后,我运行ff语句.
people = session.query(Person).all()
人员表不包含任何数据(至今),因此当我打印变量人员时,我得到一个空列表.
我将我的ORM类People中引用的表重命名为people_foo(不存在).
然后我再次运行脚本.我很惊讶在尝试访问不存在的表时没有抛出任何异常.
因此,我有以下两个问题:
如果它有帮助,我使用PostgreSQL作为数据库
[编辑]
我正在写一个包.在我的people脚本中,我有以下代码(在此缩写):
people = session.query(Person).all()
Run Code Online (Sandbox Code Playgroud)
[EDIT2]
common模块正确设置记录器,我可以在导入common的其他模块中使用logger.
但是在dbfuncs模块中,我收到以下错误/警告:
没有找到记录器"sqlalchemy.engine.base.Engine"的处理程序
我正在尝试使用Flask和Flask-Login扩展来在Flask应用程序中实现用户身份验证.目标是从数据库中提取用户帐户信息,然后登录用户,但我遇到了困难; 但是,我已将其缩小到Flask-Login行为的特定部分.
根据Flask-Login文档,我需要创建一个user_loader"回调"函数.这个功能的实际目的和实现让我困惑了几天:
您需要提供user_loader回调.此回调用于从存储在会话中的用户ID重新加载用户对象.它应该采用用户的Unicode ID,并返回相应的用户对象.例如:
Run Code Online (Sandbox Code Playgroud)@login_manager.user_loader def load_user(userid): return User.get(userid)
现在,假设我希望用户在表单中输入名称和密码,检查数据库,然后登录用户.数据库的东西工作正常,对我来说没问题.
这个'回调'函数想要传递一个用户ID#,并返回User对象(我从数据库加载的内容).但是我并没有真正得到它应该检查/做的事情,因为无论如何用户ID都是从同一个地方拉出来的.我可以"排序"让回调起作用,但它似乎凌乱/黑客,并且它会使用浏览器请求的每个资源来访问数据库.我真的不想检查我的数据库,以便在每次刷新页面时下载favicon.ico,但烧瓶登录似乎正在强制执行此操作.
如果我不再次检查数据库,那么我无法从此函数返回User对象.User对象/类在flask路径中创建以便登录,因此超出了回调的范围.
我无法弄清楚的是如何将User对象传递给此回调函数,而不必每次都访问数据库.或者,否则要弄清楚如何以更有效的方式做到这一点.我必须遗漏一些基本的东西,但我已经盯着它看了几天,抛出了各种各样的功能和方法,没有任何结果.
以下是我的测试代码中的相关摘录.用户类:
class UserClass(UserMixin):
def __init__(self, name, id, active=True):
self.name = name
self.id = id
self.active = active
def is_active(self):
return self.active
Run Code Online (Sandbox Code Playgroud)
我用来将用户对象返回到Flask-Login的user_loader回调函数的函数:
def check_db(userid):
# query database (again), just so we can pass an object to the callback
db_check = users_collection.find_one({ 'userid' : userid })
UserObject = UserClass(db_check['username'], userid, active=True)
if userObject.id == userid:
return UserObject
else:
return None
Run Code Online (Sandbox Code Playgroud)
'回调',我不完全理解(必须返回User对象,它是从数据库中提取后创建的):
@login_manager.user_loader
def …Run Code Online (Sandbox Code Playgroud)