Промежуточное ПО для отслеживания сеансов пользователей в Django - PullRequest
0 голосов
/ 26 октября 2019

Я пытаюсь настроить базовый счетчик сеансов для пользователей, которые заходят на сайт, чтобы я мог знать, насколько они активны. Я хочу, чтобы он запускался не только тогда, когда они заполняют форму входа в систему, но и когда они возвращаются, уже вошедшие в систему. Я разделяю сохранение сеансов на 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. Так что я думаю, что это проблема, но не уверен, что с этим делать.

...