Определение Первый вошедший в систему пользователь: первый, кто прошел аутентификацию, что означает, что никто другой в этот момент не вошел в систему, кроме него.
Это веб-приложение 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)
resume_pbi_capacity()
ждет 30 секунд, пока Azure не вернет сообщение об успешном выполнении? Если это так, вам нужно переместить это в асинхронный фоновый поток, чтобы он не блокировал основное приложение. Сигнал является синхронным, это просто обход в потоке кода, но он происходит во время входа в систему и блокирует возврат представления входа в систему до тех пор, пока он не будет выполнен. - person dirkgroten   schedule 09.09.2019resume_pbi_capacity
возвращается немедленно (выполняет свою работу в фоновом режиме). Ваш вход в систему должен просто перенаправляться на панель инструментов. Затем представление панели мониторинга (которое вызывает ваш API Azure) должно истечь время ожидания и отобразить ожидающее сообщение. - person dirkgroten   schedule 09.09.2019