在处理 Django 中的每个视图之前检查特定条件
Check for a certain condition before processing each view in Django
我正在构建一个多租户 Django 应用程序,我需要在处理每个视图之前检查特定条件,类似于检查用户是否经过身份验证的 login_required
装饰器。
如果条件不成立,则停止处理视图并将用户转到登录页面。
如何为我的应用程序中的每个视图实现此功能
我的情况-
def index_view(request):
domain1 = Domain.objects.get(tenant=request.user.client_set.first())
domain2 = request.META["HTTP_HOST"].split(":")[0]
# Condition
if str(domain1) != domain2:
return redirect("accounts:login")
return render(request, "dashboard/index.html")
您可以像下面的代码一样使用 @user_passes_test 装饰器
创建一个名为 condition_to_fulfil(user)
的方法
def condition_to_fulfil(user):
# enter condition here
if user_meets_condition:
return True
else:
return False
像这样在视图上方添加装饰器
@login_required
@user_passes_test(condition_to_fulfil, login_url="/login/")
def index_view(request):
domain1 = Domain.objects.get(tenant=request.user.client_set.first())
domain2 = request.META["HTTP_HOST"].split(":")[0]
您可以创建一个装饰器来为您完成这项工作
def check_domain(func):
def wrapper(request, *args, **kwargs):
domain1 = Domain.objects.get(tenant=request.user.client_set.first())
domain2 = request.META["HTTP_HOST"].split(":")[0]
# Condition
if str(domain1) != domain2:
return redirect("accounts:login")
return func(request, *args, **kwargs)
return wrapper
@check_domain
def index_view(request):
return render(request, "dashboard/index.html")
阅读更多关于装饰器的内容here.
我正在构建一个多租户 Django 应用程序,我需要在处理每个视图之前检查特定条件,类似于检查用户是否经过身份验证的 login_required
装饰器。
如果条件不成立,则停止处理视图并将用户转到登录页面。
如何为我的应用程序中的每个视图实现此功能
我的情况-
def index_view(request):
domain1 = Domain.objects.get(tenant=request.user.client_set.first())
domain2 = request.META["HTTP_HOST"].split(":")[0]
# Condition
if str(domain1) != domain2:
return redirect("accounts:login")
return render(request, "dashboard/index.html")
您可以像下面的代码一样使用 @user_passes_test 装饰器
创建一个名为 condition_to_fulfil(user)
的方法def condition_to_fulfil(user):
# enter condition here
if user_meets_condition:
return True
else:
return False
像这样在视图上方添加装饰器
@login_required
@user_passes_test(condition_to_fulfil, login_url="/login/")
def index_view(request):
domain1 = Domain.objects.get(tenant=request.user.client_set.first())
domain2 = request.META["HTTP_HOST"].split(":")[0]
您可以创建一个装饰器来为您完成这项工作
def check_domain(func):
def wrapper(request, *args, **kwargs):
domain1 = Domain.objects.get(tenant=request.user.client_set.first())
domain2 = request.META["HTTP_HOST"].split(":")[0]
# Condition
if str(domain1) != domain2:
return redirect("accounts:login")
return func(request, *args, **kwargs)
return wrapper
@check_domain
def index_view(request):
return render(request, "dashboard/index.html")
阅读更多关于装饰器的内容here.