6

Pyramid doc の「 Making A “User Object” Available as a Request Attribute」の例を使用して、ユーザー データのアクセス可能なキャッシュを作成しようとしています。

次のコードを使用して、ユーザー オブジェクトを set_request_property に返しています。

from pyramid.security import unauthenticated_userid

def get_user(request):
    # the below line is just an example, use your own method of
    # accessing a database connection here (this could even be another
    # request property such as request.db, implemented using this same
    # pattern).
    dbconn = request.registry.settings['dbconn']
    userid = unauthenticated_userid(request)
    if userid is not None:
        # this should return None if the user doesn't exist
        # in the database
        return dbconn['users'].query({'id':userid})

データベースからユーザー情報を検索するために unauthenticated_userid(request) を使用している理由がわかりません...それは安全ではありませんか? つまり、ユーザーがログインしていない可能性があるのに、なぜその ID を使用してデータベースから個人情報を取得しているのですか?

すべきではない

    userid = authenticated_userid(request)

ユーザーがログインしていることを確認する代わりに使用されますか? unauthenticated_userid(request) を使用する利点は何ですか? ここで何が起こっているのかを理解するのを手伝ってください。

4

3 に答える 3

3

unauthenticated_userid通話は安価な通話です。認証プロセス全体を再度実行することなく、リクエストからユーザー ID を検索します。

そこの重要な概念は再び言葉です。このメソッドは、すでに承認されているビューでのみ使用してください。つまり、使用unauthenticated_useridするコードにたどり着くまでに、すでにユーザーを確認しており、特にこの特定の呼び出しに対してこれを再度行いたくないということです。

バックエンドの永続ストレージに対してユーザーを認証すると、特にそのようなストレージがキャッシュをサポートしていない場合、コストがかかる可能性があります。API メソッドは、unauthenticated_useridリクエストが基本的にuseridキャッシュである最適化です。

于 2012-09-22T21:09:07.780 に答える
1

Martijn Pieters が正しいようです。

これをテストするための私のマイクロ ベンチマーク (私のプロジェクトでは、Redis をユーザーおよびその他すべての DB として使用しています):

print ('start test')
t1 = time()
authenticated_userid(self.request)
print ('authenticated: ' + str(time()-t1))
t1 = time()
unauthenticated_userid(self.request)
print ('unauthenticated: ' + str(time()-t1))
print ('test_stop')

結果:

start test
REDIS AUTH! # <-- actually this is query to groups finder in Redis
authenticated: 0.00032901763916
unauthenticated: 7.31945037842e-05
test_stop

数回テストされましたが、結果は一定です:)物事をより「明確」にするために、Pyramidドキュメントのその記事にMartijnの回答を追加する必要があると思いますか? :)

于 2012-09-22T21:36:37.013 に答える