在处理 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.