django - 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)
解决方案
这里有很多很多问题。
首先,为了重定向,您需要实际返回重定向,而不仅仅是 URL 或呈现的模板。例如:
from django.shortcuts import redirect
...
return redirect('loading')
但是,这只是您可以从视图中执行的操作。您不能从信号重定向;这根本不是一件有意义的事情。信号的全部意义在于它用于执行与主流无关的副作用。您无权访问此处的请求或响应。
所以不幸的是,你的整个方法都是错误的。(这甚至没有谈论您如何识别“当前登录的用户”;您没有展示您的get_current_users
逻辑,但我非常怀疑它是否像您认为的那样有效。)
推荐阅读
- android - 如何分隔字符串?
- python - tkinter 按钮在使用它调用其他脚本后保持单击状态
- apache-camel - Apache Camel:如何从 setProperty-Exchange 中捕获异常?
- api - 原始.M 数组到字符串?以相同的结构响应http请求
- javascript - Django 和 Chart.js:具有多个数据集的折线图
- c++ - aruco::MarkerDetector 的未定义引用
- excel - 将工作表导出到新工作簿(特定工作表除外)的宏
- python - 弃用警告:inspect.getargspec() 自 Python 3.0 起已弃用
- sql - 在 Update 语句中使用 Min 来获取最旧的记录
- c++ - 检测多维数组中的墙 C++ 问题