我来自 PHP 世界,经常使用 Joomla。现在我正在构建一个 Python web 应用程序,当我遇到一个非常基本的问题时,我的第一步是创建用户管理:当你的模型只代表一个数据库行时,你如何管理一个类中的所有用户。
举个例子会更清楚。这是 Joomla 所做的:
JUser::getInstance($userid)
它所做的是 JUser 类,它有一个静态方法 getInstance(),该方法对在所有实例中都有效的静态变量进行操作。通过这种方式,JUser 管理所有用户,同时仅将一个 用户表示为该类的一个实例。
现在在 Python 上我使用 SQLAlchemy 并有一个像这样的类:
class User(Base):
...等等。在我现在开始做来自蹩脚的 PHP 世界的蹩脚的东西之前,我想知道:这里正确和干净的方法是什么?构建一个包含所有用户的新 Users 类?还是这种静态方法是个好概念?
我已经在谷歌上搜索了一段时间,但我似乎无法找到关于这个主题的内容:使用 MV(C) 模型在 Python 中构建更大的应用程序。任何人都有我可以阅读的任何好的链接吗?
以更具体的方式:我该如何解决这个问题?
请您参考如下方法:
您应该创建一个模型类,就像 Joomla 所做的那样:
class User(Base):
...
然后您可以使用 SQLAlchemy 的通用功能,并查询您需要的用户,
使用主键:
user = session.query(User).get(user_id)
或使用唯一的用户名/电子邮件:
user = session.query(User).filter(User.username==my_username).first()
谈到为当前 HTTP 请求登录的用户,Web 框架通常会自动为您提供一个实例,并将其传递给您正在实现的 HTTP 请求处理程序。例如,Django 框架为您提供开箱即用的 ORM 用户实例,因为它具有所有身份验证和 session 功能。我还将 Flask 微框架与 Flask-login 模块和 SQLAlchemy 一起使用,在那里你需要实现一个回调,它通过用户 Id 加载用户实例,就像我之前说的:
@login_manager.user_loader
def load_user(userid):
# just query for user
return User.query.get(userid) # User.query is Flask-SQLAlchemy extension, it's same to session.query(User).get(userid)
然后您可以从线程局部变量中获取您的用户实例:
from flask.ext.login import login_required, current_user
@app.route('/hello/')
@login_required
def my_request_handler():
return "<html><body>Current user is %s</body></html>" % current_user.username
当然你可以实现一个静态方法,如果你需要通过 Id 获取用户实例的快捷方式:
class User(Base):
...
@classmethod
def by_id(cls, id):
return session.query(cls).get(id)
(其中 SQLAlchemy 的 session 以某种方式全局定义)
对于 Python/web 应用程序架构,您可以查看 Django — 它是非常流行且易于使用的一体式框架,并且它具有类似 MVC 的架构。就read the tutorial .
(但请注意,与 SQLAlchemy 相比,Django 自己的 ORM 功能非常有限,如果您希望使用 Django)。
