django's User model has a last_login
field, which is great if all the users were to log out each time they leave the site, but what if they don't?
How can I track when a user who never logged out and his activity on the site?
Go to the Django Admin by changing the URL in your browser to "http://localhost:8000/admin". The Django Admin login page will appear. Enter the username and password of the superuser you just created with the manage.py command to log in. Next, you will see the Django admin dashboard.
As you mentioned in your question, sessions in Django live for as long as SESSION_COOKIE_AGE determines (which defaults to 2 weeks) from the last time it was "accessed". Two exceptions for that: you can set an expiry time to a session yourself, and then it depends on that.
Each profile uses the users username to create a url for their profile. Currently if I sign in as one user and change the URL to another users profile URL, it still displays the current users profile. I want something similar to pinterest where any person whether they are signed in or not can view peoples profiles.
But the correct way to check if a user is logged in or not is to use : request. user. is_authenticated. This will return True if the person is logged in other wise False.
You need to have the last_activity
field in the user profile (or custom user model). This field will be updated on every request. To achieve this you need to have custom middleware:
profiles/middleware.py:
from django.utils import timezone
from myproject.profiles.models import Profile
class UpdateLastActivityMiddleware(object):
def process_view(self, request, view_func, view_args, view_kwargs):
assert hasattr(request, 'user'), 'The UpdateLastActivityMiddleware requires authentication middleware to be installed.'
if request.user.is_authenticated():
Profile.objects.filter(user__id=request.user.id) \
.update(last_activity=timezone.now())
Add this middleware in your setting file:
MIDDLEWARE_CLASSES = (
# other middlewares
'myproject.profiles.middleware.UpdateLastActivityMiddleware',
)
I know the question is old ... and surely it has already been solved ... but here is my contribution ... In new versions of django you can use:
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
If the user does not close the browser, you can set a time limit for the session ...
SESSION_COOKIE_AGE = 60 * 60
For "SESSION_COOKIE_AGE" if I remember correctly it's defined in seconds. You can see more here... Recommended reading is also django's own documentation about sessions...
i think in 2022 this will satisfy what you need also i did this and worked for me but the answer didnt.
put LastActivityTraceMiddleware after AuthenticationMiddleware in settings.py.
from django.utils.timezone import now
from .... import MemberEntity
class LastActivityTraceMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
member: MemberEntity = request.user
if member.is_authenticated:
member.last_login = now()
member.save()
return response
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With