Django - как перенаправить первого вошедшего в систему пользователя на страницу загрузки

Определение Первый вошедший в систему пользователь: первый, кто прошел аутентификацию, что означает, что никто другой в этот момент не вошел в систему, кроме него.

Это веб-приложение django должно полагаться на API отдыха третьих сторон (Microsoft powerbi), которые получают поминутную оплату, но оно также предоставляет возможность программно включать и выключать сервер с вызовом API отдыха в azure.

Самый очевидный способ включать и выключать сервер, это реагировать при первом входе в систему и при последнем выходе из системы.

Проблема здесь в том, что серверу требуется около 30 секунд для запуска. И мне нужно перенаправить пользователя на «загрузочную» страницу, а когда сервер включится, я снова перенаправлю его на домашнюю страницу.

в настоящее время я обнаруживаю первый вход в систему с приемником, в моем views.py у меня есть:

@receiver(user_logged_in)
def sig_user_logged_in(sender, user, request, **kwargs):
    print("user logged in: %s at %s" % (user, request.META['REMOTE_ADDR']))
    queryset = get_current_users()
    if queryset.count() == 0:
        headers_capacity = azure_auth_capacity()
        print("resuming capacity...")
        resume_pbi_capacity(headers_capacity)
        print("redirecting to loading page...")
        # Both following tries to redirect does not work
        #return '/loading/'
        #return render_to_response("loading.html")

Здесь я бы перенаправил пользователя на страницу загрузки, как вы видите, так как сервер готовится 30 секунд, но перенаправления не происходит вообще. Мне кажется, что эта функция не может перенаправить, потому что в то же время, пока другая функция работает и «задерживает систему перенаправления»,

может быть из-за этого параметра, определенного в settings.py, который перенаправляет сразу после входа в «домой»:

LOGIN_REDIRECT_URL = '/'

Или может быть эта вызываемая функция определена в url.py:

path('', pbi_dashboard_list, name='home'),

Которые выполняют следующее представление:

@login_required
def pbi_dashboard_list(request):
    # Some irrilevant code here, then redirect to an other page 
    return redirect('dashboard', dashboard_id)

Похоже, что система перенаправления здесь занята, и по этой причине я не могу выполнить перенаправление, определенное в sig_user_logged_in().

Кто-нибудь может указать мне хорошее направление в этом?

Редактировать:

def get_current_users():
    active_sessions = Session.objects.filter(expire_date__gte=timezone.now())
    user_id_list = []
    for session in active_sessions:
        data = session.get_decoded()
        user_id_list.append(data.get('_auth_user_id', None))
    # Query all logged in users based on id list
    return User.objects.filter(id__in=user_id_list)

person lese    schedule 09.09.2019    source источник
comment
Действительно ли функция resume_pbi_capacity() ждет 30 секунд, пока Azure не вернет сообщение об успешном выполнении? Если это так, вам нужно переместить это в асинхронный фоновый поток, чтобы он не блокировал основное приложение. Сигнал является синхронным, это просто обход в потоке кода, но он происходит во время входа в систему и блокирует возврат представления входа в систему до тех пор, пока он не будет выполнен.   -  person dirkgroten    schedule 09.09.2019
comment
Во-вторых, вам нужно перенаправить пользователя в представлении, а не в сигнале, как упоминает @Daniel ниже. Это не должно быть сложно, вы, вероятно, вызываете свой API где-то в представлении, просто сделайте вызов с относительно коротким временем ожидания, и если время ожидания истекло, перенаправьте своего пользователя в представление ожидания (или отобразите представление ожидания ), где javascript может перезагрузить представление через 30 секунд.   -  person dirkgroten    schedule 09.09.2019
comment
Я попытался переместить логику перенаправления в функцию просмотра, но проблема здесь в том, что я не могу проверить, является ли это первым пользователем, вошедшим в систему, поскольку в представлении пользователь уже вошел в систему, по этой причине get_current_users () вернет 1, вместо этого в @receiver первый пользователь все еще не вошел в систему, но приложение получило сигнал входа в систему, это может предоставить мне информацию, которая является первой.   -  person lese    schedule 09.09.2019
comment
Нет, я говорю, что это должны быть разные процессы. Логика для проверки и запуска вашего экземпляра Azure должна быть в обработчике сигналов, это нормально. Пока resume_pbi_capacity возвращается немедленно (выполняет свою работу в фоновом режиме). Ваш вход в систему должен просто перенаправляться на панель инструментов. Затем представление панели мониторинга (которое вызывает ваш API Azure) должно истечь время ожидания и отобразить ожидающее сообщение.   -  person dirkgroten    schedule 09.09.2019
comment
Хорошо, я понял, я попробую это :) спасибо   -  person lese    schedule 09.09.2019


Ответы (1)


Здесь очень много проблем.

Во-первых, для перенаправления вам нужно фактически вернуть перенаправление, а не просто URL-адрес или отображаемый шаблон. Например:

from django.shortcuts import redirect
...
return redirect('loading')

Однако это только то, что вы можете сделать из представления. Вы не можете перенаправить с сигнала; это просто не то, что даже имеет смысл делать. Весь смысл сигнала в том, что он предназначен для выполнения побочных эффектов, не связанных с основным потоком. У вас нет доступа к запросу или ответу здесь.

Так что, к сожалению, весь ваш подход неверен. (И это даже не говоря о том, как вы определяете «текущих зарегистрированных пользователей»; вы не показали свою get_current_users логику, но я очень сомневаюсь, что она работает так, как вы думаете.)

person Daniel Roseman    schedule 09.09.2019
comment
вы заставляете меня краснеть :`), я обновил вопрос, добавив функцию get_current_users, я понимаю, что мой подход неверен, я пытаюсь найти правильный путь для достижения этого - person lese; 09.09.2019