首页 > 解决方案 > Django - 如何将第一个登录用户重定向到加载页面

问题描述

第一个登录用户的定义:第一个进行身份验证的用户,这意味着在那一刻除了他之外没有其他人登录。

这个 django webapp 需要依赖第三方 rest api (Microsoft powerbi),它按分钟付费,但它也提供了通过对 azure 的 rest api 调用以编程方式打开和关闭服务器的可能性。

开启和关闭服务器最明显的方式,似乎是在第一次登录和最后一次注销时做出反应。

这里的问题是服务器需要大约 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 中定义的这个参数在登录到“home”后立即重定向:

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)

标签: djangoredirectreceiver

解决方案


这里有很多很多问题。

首先,为了重定向,您需要实际返回重定向,而不仅仅是 URL 或呈现的模板。例如:

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

但是,这只是您可以从视图中执行的操作。您不能从信号重定向;这根本不是一件有意义的事情。信号的全部意义在于它用于执行与主流无关的副作用。您无权访问此处的请求或响应。

所以不幸的是,你的整个方法都是错误的。(这甚至没有谈论您如何识别“当前登录的用户”;您没有展示您的get_current_users逻辑,但我非常怀疑它是否像您认为的那样有效。)


推荐阅读