Djangoでは、最後にログインしたユーザーの時間をAuth.User.last_login
で取得できます。これは、ユーザー名/パスワードを使用してユーザーがログインしたときにのみ更新されます。ユーザーがすでにログインしていて、認証情報がCookieに保存されているため、ログインせずにサイトにアクセスできるとします。ユーザーが以前にサイトにアクセスした日時を取得するにはどうすればよいですか。これは、最後の訪問以降に新しいレコードの数を取得するなどのクエリに役立ちます。Django:最終訪問日を取得
答えて
例モデル:全てのログインしているユーザのために実行される
class User(models.Model):
last_visit = models.DateTimeField(...)
...
例ミドルウェア:
from django.utils.timezone import now
class SetLastVisitMiddleware(object):
def process_response(self, request, response):
if request.user.is_authenticated():
# Update last visit time after request finished processing.
User.objects.filter(pk=request.user.pk).update(last_visit=now())
return response
広告Dあなたのsettings.pyに新しいミドルウェア:
MIDDLEWARE_CLASSES = (
...
'path.to.your.SetLastVisitMiddleware',
...
)
警告:テストされていませんが、インストールする外部のパッケージを必要とせず、それは、コードの唯一の5行ですが。
は、ここでユーザーの最後の活動を追跡し、時間の間隔で区切られたカウントされますミドルウェアだMiddlewareとcustom user models
'process'_responseの最後に' response'オブジェクトを返す必要があります。 django-last-seenはパッケージ化された解決策ですが、私はこの要求に応じていつでも 'LastSeen.object.when'を呼び出す必要があります。もちろん、私はミドルウェアに 'LastSeen.object.when'を入れることができますが、自分のミドルウェアを書くこともできます。 – user2233706
I would go for django-last-seen
使用:
from last_seen.model import LastSeen
seen = LastSeen.object.when(user=user)
ありがとうございました。私はジャンゴを最後に見てみましょう。 Python Fanboyの答えは十分かもしれませんが、私は "モジュール"に基づいて追跡する必要があります。 – user2233706
本当にいいですね!このパッケージはまだ動作していますか? – ilse2005
このパッケージはdjangoの最新バージョンでは動作しなくなりました。 – Jakobovski
(ジャンゴ1.5以降)についてのドキュメントの詳細情報。この間隔を使用すると、データベースへの書き込みを最小限に抑えるという利点とともに、追跡/カウントできる個別の「セッション」が作成されます。
認証ユーザーがリクエストを実行するたびに、最後にアクティビティが見つかった がキャッシュに記録され、新しいタイムスタンプでキャッシュが更新されます。 アクティビティの間隔に少なくとも「間隔」の時間がある場合は、 データベースのタイムスタンプが更新されます。
from datetime import timedelta as td
from django.utils import timezone
from django.conf import settings
from django.db.models.expressions import F
from <user profile path> import UserProfile
class LastUserActivityMiddleware(object):
KEY = "last-activity"
def process_request(self, request):
if request.user.is_authenticated():
last_activity = request.session.get(self.KEY)
# If key is old enough, update database.
too_old_time = timezone.now() - td(seconds=settings.LAST_ACTIVITY_INTERVAL_SECS)
if not last_activity or last_activity < too_old_time:
UserProfile.objects.filter(user=request.user.pk).update(
last_login=timezone.now(),
login_count=F('login_count') + 1)
request.session[self.KEY] = timezone.now()
return None
コメント:
- あなたが
settings.LAST_ACTIVITY_INTERVAL_SECS
を定義する方法新しいログインであると考えられて非活動の間隔を構成するものを決定。 - これは私のUserオブジェクトと1:1の "UserProfile"オブジェクトを更新しますが、あなたが好きなオブジェクトは更新できます。
settings.MIDDLEWARE_CLASSES
に必ず入力してください。- このミドルウェアは
APPEND_SLASH
が論じられるようrequest.user
が使用不能であることが原因となり、process_request
ないprocess_response
が他ミドルウェア順序に応じて使用注:Django: WSGIRequest' object has no attribute 'user' on some pages?
私は 'dateutil.parser import parse'を追加して、' last_activityまたはlast_activity
忘れてしまった理由:Djangoセッションでは、明らかにtimezone.now()のようなdatetimeがJSONの直列化可能なデータを必要とするため、代わりにdatetime.isoformat()を使用して文字列として格納し、そのデータを解析してdatetimeに戻す必要がありました。 –
- 1. URLの最終更新日を取得
- 2. 最終日の質問
- 3. サイト内の「最も訪問された」リンク/ページを取得
- 4. VerifyError:クラスnet.sf.cglib.core.DebuggingClassWriterが最終メソッド訪問をオーバーライドします。
- 5. ファイルの最終更新日をVB6で取得
- 6. 最終更新日時のフォルダ(またはサブファイル/フォルダ)を取得
- 7. Groovy HTTPBuilderが最終更新日時を取得
- 8. カレンダー - 前月の最終日を取得する
- 9. SharePointリスト(SPList)の最終更新日を取得する方法
- 10. SSAS/MDX/ADOMD.NET - キューブから最終更新日を取得する
- 11. Antタスク最終更新日時を取得
- 12. Javaでファイルの最終更新日を取得する
- 13. SharePoint:ユーザーの最終ログアウトまたは最終セッションの終了日時を取得する方法
- 14. GACのアセンブリの最終変更日の取得
- 15. Oracle関数の前月の最終日の取得
- 16. jQuery最終日の日付
- 17. Djangoの訪問者の人数
- 18. ファイルの最終アクセス時間を取得
- 19. クリック時の最終値を取得
- 20. Androidで週の開始日と終了日を取得する
- 21. コマンドプロンプトを使用して月の最終日を取得する方法
- 22. クラウドフレアの裏に訪問者ipv4を取得する
- 23. 訪問者のOptimizely A/Bテストとバリエーションを取得する
- 24. ウェブサイトの訪問者の電子メールアラートを取得する場所
- 25. GAEでページの訪問者数を取得するには?
- 26. OrientDBのshortestPath()の訪問先エッジを取得する
- 27. 訪問者にプライベートIPを取得し、訪問者を追跡するためにデータベースに格納します
- 28. 最近訪問したhtmlページを訪問者が表示する
- 29. サーバー上のapkファイルから最終更新日を取得する方法
- 30. 私のウェブサイトで各URLの最終更新日を取得するには、C#
https://godjango.com/blog/record-last-access-not- just-last-login /は、ミドルウェアの場合のような特別な検索をしないので、より効率的です。 –