2

我来自 PHP 世界,在 Joomla 上工作了很多。现在我正在构建一个 Python Web 应用程序,当我面临一个非常基本的问题时,我的第一步是创建一个用户管理:当你的模型只代表一个数据库行时,你如何管理一个类中的所有用户。

一个例子将使这一点更清楚。这是 Joomla 所做的:

JUser::getInstance($userid)

这样做是有一个类JUser,它有一个静态方法getInstance(),该方法对一个在所有实例中都有效的静态变量进行操作。通过这种方式,JUser管理所有用户,同时仅将一个用户表示为类的实例。

现在在 Python 上,我使用 SQLAlchemy 并有一个像这样的类:

class User(Base):

... 等等。在我现在开始从一个糟糕的 PHP 世界做一些糟糕的事情之前,我想知道:这里正确和干净的方法是什么?构建一个Users包含所有用户的新类?或者这种静态方法方法是一个好概念吗?

我已经在谷歌上搜索了一段时间,但似乎找不到关于这个主题的内容:使用 MV(C) 模型在 Python 中构建更大的应用程序。任何人都可以阅读我可以阅读的任何好的链接?

以更具体的方式:我该如何解决这个问题?

4

1 回答 1

1

您应该创建一个模型类,就像 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 开箱即用地为您提供用户实例,因为它具有所有身份验证和会话功能。我还将 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 的会话以某种方式全局定义)

对于 Python/Web 应用程序架构,您可以查看Django——它非常流行且易于使用的一体式框架,并且它具有类似 MVC 的架构。只需阅读教程

(但请注意,如果您希望使用 Django,Django 自己的 ORM 的功能与 SQLAlchemy 相比非常有限)。

于 2012-07-18T17:56:10.517 回答