【问题标题】:Django decorators to handle admin users redirection处理管理员用户重定向的 Django 装饰器
【发布时间】:2021-03-24 20:44:53
【问题描述】:

我希望普通用户被重定向到<address>/panel,并且需要管理员被重定向到<adress>/admin。所以我在views.py 中所做的事情是这样的:

from django.contrib.auth.decorators import login_required

@unauthenticated_user
def registration_view(request):
    ...

@unauthenticated_user
def login_view(request):
    ...

@login_required(login_url='login')
@allowed_users(allowed_roles=['admin'])
def admin_home_view(request):
    context = {}
    return render(request, 'account/admin/home-page.html', context)

@login_required(login_url='login')
@allowed_users(allowed_roles=['user'])
def user_home_view(request):
    context = {}
    return render(request, 'account/user/home-page.html', context)

在这里更新

decorators.py 我有:

from django.http import HttpResponse
from django.shortcuts import redirect
from groups_manager.models import Group, GroupMemberRole, Member

def unauthenticated_user(view_func):
    def wrapper_func(request, *args, **kwargs):
        if request.user.is_authenticated:
            return redirect('panel')
        else:
            return view_func(request, *args, **kwargs)
    return wrapper_func

def allowed_users(allowed_roles=[]):
    def decorator(view_func):
        def wrapper_func(request, *args, **kwargs):
            allowed_role = allowed_roles[0]
            username = request.user.username
            member = Member.objects.get(username=username)
            roles = GroupMemberRole.objects.filter(groupmember__member=member)
            member_roles = []
            for role in roles:
                member_roles.append(role.label)
            if 'admin' in member_roles:
                ...
            elif 'user' in member_roles:
                ...
            else:
                return HttpResponse('you are not allowed')
        return wrapper_func
    return decorator

我想知道如何将admin 用户重定向到<address>/admin 网址。但是管理员用户被重定向到/panel url。

我的urls.py 是:

urlpatterns = [
    path('admin', views.admin_home_view, name='admin'),


    path('panel', views.user_home_view, name='panel'),

    path('panel/register', views.registration_view, name='register'),
    path('panel/logout', views.logout_view, name='logout'),
    path('panel/login', views.login_view, name='login'),
]

【问题讨论】:

  • login_view 上放置一个重定向,在您验证请求后,您知道将它们发送到哪里。
  • 我应该完全摆脱装饰器吗?如果您单独回答,我将不胜感激
  • @markwalker_ 我更新了问题。我尝试将所有角色附加到列表中,然后尝试重定向它们。我如何在 login_view 中告诉它?

标签: python django python-decorators


【解决方案1】:

你应该看看django-braces,因为它是一个很棒的应用程序,可以用它的装饰器和混入来处理这些类型的用户/身份验证场景(但这需要你切换到基于类的视图以供以后使用)。

您可以/应该覆盖 django 的 LoginView,您可以看到 here 并执行类似的操作;

from django.contrib.auth.views import LoginView as DjangoLogin
from django.http import HttpResponseRedirect


class LoginView(DjangoLogin):
    """ Custom Login """

    def form_valid(self, form):
        """Security check complete. Log the user in."""
        user = form.get_user()
        auth_login(self.request, user)

        # Do your permissions check here
        if user.is_staff:
            return HttpResponseRedirect('/admin')
        else:
            return HttpResponseRedirect('/panel')

【讨论】:

    【解决方案2】:

    我根据@markwalker_帮助得到了我认为的答案。

    现在我的decorators.py 是:

    from django.shortcuts import redirect
    
    def unauthenticated_user(view_func):
        def wrapper_func(request, *args, **kwargs):
            if request.user.is_authenticated:
                return redirect('panel')
            else:
                return view_func(request, *args, **kwargs)
        return wrapper_func
    

    在我的login_view 我有:

    login(request, user)
    member = Member.objects.get(username=username)
    roles = GroupMemberRole.objects.filter(groupmember__member=member)
    member_roles = []
    for role in roles:
        member_roles.append(role.label)
    if 'admin' in member_roles:
        return redirect('admin')
    else:
        return redirect('panel')
    

    我认为这可能是一种可靠的工作方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-27
      • 2020-10-25
      • 1970-01-01
      • 2012-04-18
      • 2013-08-26
      • 2013-11-15
      • 2011-12-25
      • 1970-01-01
      相关资源
      最近更新 更多