Skip to main content
 首页 » 编程设计

python之Python 中包含单项组的应用程序布局

2025年05月04日11mayingbao

我来自 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)。