Я пытаюсь настроить базовый счетчик сеансов для пользователей, которые заходят на сайт, чтобы я мог знать, насколько они активны. Я хочу, чтобы он запускался не только тогда, когда они заполняют форму входа в систему, но и когда они возвращаются, уже вошедшие в систему. Я разделяю сохранение сеансов на 1 час, считая сеансы, которые происходят в течение того же часа, что и тот же сеанс.
Промежуточное программное обеспечение: (1) сохраняет новый сеанс в объекте UserSession
и (2) увеличивает total_visits
на 1 для объекта UserProfile
.
Моя проблема заключается в том, что он сохраняет 2 сеансаза посещение и увеличив счет на два. Так что в основном он запускается дважды перед установкой кэша.
в файле settings.py
MIDDLEWARE = (
...
'my_app.middleware.LastUserActivityMiddleware',
)
, который указывает на это промежуточное ПО
def LastUserActivityMiddleware(get_response):
def middleware(request):
"""
Save the time of last user visit
"""
response = get_response(request)
if request.session.session_key:
key = "recently-seen-{}".format(request.session.session_key)
recently_seen = cache.get(key)
# is_authenticated hits db as it selects user row
# so we will hit it only if user is not recently seen
if not recently_seen and request.user.is_authenticated:
try:
user_profile = UserProfile.objects.get(user=request.user)
user_profile.total_visits= F('total_visits') + 1
user_profile.save()
except:
UserProfile.objects.create(user=request.user, total_visits=1)
UserSession.objects.get_or_create(user=request.user, session_key=request.session.session_key)
visit_time = 60 * 60 # wait one hour before logging new session
cache.set(key, 1, visit_time)
return response
return middleware
Я не совсем уверен, чтоЯ делаю здесь, но я думаю, что я узнал, что промежуточное программное обеспечение вызывается дважды при входе в систему - (1) POST-запрос на вход в систему, он будет иметь дом HETpRedirectResponse (2) GET, он будет иметь TemplateResponse. Так что я думаю, что это проблема, но не уверен, что с этим делать.