如何在 django 中分离用户登录会话和管理员登录会话

问题描述 投票:0回答:2

我创建了小型电子商务网站。 用户可以注册和登录,还可以为管理员创建自定义管理面板,可以添加、更新和删除产品。 User 和 Admin 两个 URLS 是不同的。问题是,当用户在我点击管理员 URLS 后登录网站时,直接重定向到我想阻止的管理仪表板。

在这里我的面板应用程序可以处理管理站点链接管理员可以添加和更新产品

def Login_Page(request):
    if request.user.is_authenticated:
        return redirect('dashboard')
    if request.method == "POST":
        username = request.POST.get('username')
        password = request.POST.get('password')
        try:
            user = User.objects.get(username = username)
        except:
            messages.error(request,'User Does Not Exist !')
        try:
            vendor_authe = User_login.objects.get(user_auth=user, is_vendor_user='y',is_customer_user='n')
            user = authenticate(request, username= username, password = password)
            if user is not None:
                login(request, user)
                return redirect('dashboard')
            else:
                messages.error(request,'Username and Password Does Not Match. !')
        except:
            messages.error(request,'User not Found !')
       
    else:
        pass
    context = {

    }
    return render(request,'panel/login.html',context)

这是我的基本应用程序 view.py,它可以处理用户端登录

# Create your views here.
def User_Login_Page(request):
    if request.user.is_authenticated:
        return redirect('home')
    if request.method == "POST":
        username = request.POST.get('username')
        password = request.POST.get('password')
        try:
            user = User.objects.get(username = username)
        except:
            messages.error(request,'User Does Not Exist !')
        try:
            user_authe = User_login.objects.get(user_auth=user, is_vendor_user='n',is_customer_user='y')
            user = authenticate(request, username= username, password = password)
            if user is not None:
                login(request, user)
                return redirect('home')
            else:
                messages.error(request,'Username and Password Does Not Match. !')
        except:
            messages.error(request,'User not Found !')
    else:
        pass
    context = {
        'form_type':'user_login'
    }
    return render(request,'base/login.html', context)

Here base app urls.py

from django.contrib import admin
from django.urls import path, include
from . import views


urlpatterns = [
    path('user-login/', views.User_Login_Page, name="user_login"),
    path('user-registration/', views.User_Registration, name="user_registration"),
    path('user-logout/', views.User_Logout, name="user_logout"), 
   
    path('', views.HomePage, name="home"),
]

这里面板应用程序 urls.py

from django.contrib import admin
from django.urls import path, include
from . import views
urlpatterns = [
    
    path('', views.Login_Page, name="login_page"),
    path('logout/', views.Vendor_logout, name="logout_page"),
    
    path('dashbord/', views.Dashboard_Page, name="dashboard"),
]
python django django-views django-urls django-sessions
2个回答
0
投票

您可以在仪表板视图中添加验证:

# Check if the user has staff status to view the page.
if request.user.is_staff:
    # your code...
else:
    messages.error(request,'You do not have the necessary permissions to view this page.')

0
投票

为了防止用户在登录后访问管理仪表板,您可以在

Login_Page
视图中添加一个检查以查看登录的用户是否是管理员。如果用户是管理员,则将他们重定向到管理员登录页面而不是管理员仪表板,如下所示:

def 登录页面(请求):
    如果请求.user.is_authenticated:
        如果request.user.is_staff:
            返回重定向('管理员:登录')
        别的:
            返回重定向('仪表板')
    
    如果 request.method == "POST":
        username = request.POST.get('用户名')
        password = request.POST.get('密码')
        尝试:
            user = User.objects.get(用户名=用户名)
        除了:
            messages.error(request,'用户不存在!')
            返回重定向('login_page')
        
        尝试:
            vendor_authe = User_login.objects.get(user_auth=user, is_vendor_user='y',is_customer_user='n')
            user = authenticate(请求, 用户名=用户名, 密码=密码)
            如果用户不是无:
                登录(请求,用户)
                如果 user.is_staff:
                    # 用户是管理员,重定向到管理员登录页面
                    返回重定向('管理员:登录')
                别的:
                    # 用户是普通用户,重定向到仪表板
                    返回重定向('仪表板')
            别的:
                messages.error(request,'用户名和密码不匹配。!')
        除了:
            messages.error(请求,'找不到用户!')
            
    上下文 = {}
    返回渲染(请求,'panel/login.html',上下文)

注意: 基于函数的视图通常写成

snake_case
而不是
PascalCase
,所以最好将其命名为
login_page
user_login_page
,而不是分别为
Login_Page
User_Login_Page

© www.soinside.com 2019 - 2024. All rights reserved.