2

現在web2pyアプリケーションにログインしているすべてのユーザーを取得するための迅速で簡単な方法はありますか?このページの管理者に、現在ログインしている非管理者ユーザーの数を表示したいと思います。ありがとう..

4

1 に答える 1

9

「現在ログイン中」は明確に定義された概念ではないことに注意してください。ログインできますが、コンピュータから離れるか、ブラウザを閉じます。その場合、あなたはまだログインしていますか?おそらくログインしていると見なされるべきではありませんが、サーバーはあなたが立ち去った、またはブラウザーを閉じたことを認識していません. Auth システムはログインおよびログアウト イベントを auth_events テーブルに記録します。そのため、1 つのオプションは、定義された期間内にログインしたが、それ以降明示的にログアウトしていないすべてのユーザーを見つけることです。一部のユーザーは明示的にログアウトせずにサイトを離れた可能性があるため、これはログインしているユーザーの数を誇張している可能性があることに注意してください。ここにいくつかのコードがあります:

import datetime
limit = request.now - datetime.timedelta(minutes=30)
query = db.auth_event.time_stamp > limit
query &= db.auth_event.description.contains('Logged-')
events = db(query).select(db.auth_event.user_id, db.auth_event.description,
    orderby=db.auth_event.user_id|db.auth_event.time_stamp)
users = []
for i in range(len(events)):
    last_event = ((i == len(events) - 1) or
                   events[i+1].user_id != events[i].user_id)
    if last_event and 'Logged-in' in events[i].description:
        users.append(events[i].user_id)
logged_in_users = db(db.auth_user.id.belongs(users)).select()

上記は、過去 30 分以内にログインしたが、明示的にログアウトしていないすべてのユーザーを示しています。

より洗練されたアプローチでは、ログインしたユーザーのリクエストを追跡して、誰がアプリケーションをアクティブに使用しているかを判断します。ログインしている各ユーザーの最新のリクエストのタイムスタンプを格納する辞書をキャッシュできます。レポートが要求されたら、最近のタイムフレーム内のタイムスタンプを持つユーザーを表示します (そして、古いタイムスタンプを持つユーザーを削除して、キャッシュが大きくなりすぎないようにします)。

もう 1 つのオプションは、セッション ファイルを検査することです。一定の期間内に変更されたセッションを特定します。その中で、「auth」オブジェクトを含むものを見つけ、最後のリクエストの時間を auth.last_visit で確認します (実際、auth.last_visit は、前回の訪問からの時間が auth.settings の 1/10 を超えた場合にのみ更新されます)。 .expiration time (デフォルトは 3600 秒)。

于 2012-09-01T01:19:56.340 に答える