2

私はPHPの世界から来ており、Joomlaで多くの仕事をしました。現在、Python Webアプリケーションを構築しています。最初のステップは、モデルが単一のデータベース行のみを表す場合に、1つのクラスのすべてのユーザーをどのように管理するかという非常に基本的な質問に直面したときにユーザー管理を作成することです。

例を使用すると、これがより明確になります。Joomlaが行ったことは次のとおりです。

JUser::getInstance($userid)

これが行ったのは、クラスがあり、すべてのインスタンス間で有効な静的変数を操作JUserする静的メソッドがあります。getInstance()このようにして、クラスのインスタンスとして1人のユーザーJUserのみを表す一方で、すべてのユーザーを管理しました。

今Pythonで私はSQLAlchemyを使用し、次のようなクラスを持っています:

class User(Base):

... 等々。くだらないPHPの世界からやってくるくだらないことを始める前に、私は知りたかったのです。ここでの正しくてクリーンなアプローチは何ですか?すべてのユーザーを保持する新しいUsersクラスを作成しますか?それとも、この静的な方法のアプローチは良い概念ですか?

私はしばらくの間グーグルをしてきましたが、このトピックについて何かを見つけることができないようです:MV(C)モデルを使用してPythonでより大きなアプリケーションを構築する。誰かが私が読むことができるこれに関する良いリンクを持っていますか?

より具体的な方法で:この問題を解決するにはどうすればよいですか?

4

1 に答える 1

1

Joomlaが行ったように、1つのモデルクラスを作成する必要があります。

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-loginモジュールとSQLAlchemyでFlaskマイクロフレームワークを使用します。そこで、前に述べたように、ユーザー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を使用したい場合は、SQLAlchemyと比較してDjango自体のORMの機能が非常に制限されていることに注意してください)。

于 2012-07-18T17:56:10.517 に答える