用于处理管理员用户重定向的 Django 装饰器
Django decorators to handle admin users redirection
我希望将普通用户重定向到 <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
url。但是管理员用户被重定向到 /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'),
]
我得到了我认为基于@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')
我认为这可能是一种可靠的工作方式。
你应该看看 django-braces 因为它是一个很好的应用程序,可以用它的装饰器和混音处理这些类型的 user/auth 场景(但这需要你切换到 class 基于观点为后)。
你 could/should 覆盖 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')
我希望将普通用户重定向到 <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
url。但是管理员用户被重定向到 /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'),
]
我得到了我认为基于@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')
我认为这可能是一种可靠的工作方式。
你应该看看 django-braces 因为它是一个很好的应用程序,可以用它的装饰器和混音处理这些类型的 user/auth 场景(但这需要你切换到 class 基于观点为后)。
你 could/should 覆盖 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')