Django 中管理员和普通用户登录分离
时间: 2023-06-11 07:06:10 浏览: 71
在 Django 中,可以通过自定义用户认证系统来实现管理员和普通用户登录分离。
首先,需要创建一个新的用户模型,它继承自 Django 自带的 AbstractBaseUser 和 PermissionsMixin,例如:
```python
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
from django.db import models
from django.utils import timezone
class CustomUser(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(unique=True)
username = models.CharField(max_length=30, unique=True)
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
date_joined = models.DateTimeField(default=timezone.now)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
def __str__(self):
return self.email
def get_full_name(self):
return self.username
def get_short_name(self):
return self.username
```
然后,需要创建一个自定义认证后端,它继承自 Django 自带的 ModelBackend,例如:
```python
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth import get_user_model
class CustomBackend(ModelBackend):
def authenticate(self, request, email=None, password=None, **kwargs):
UserModel = get_user_model()
try:
user = UserModel.objects.get(email=email)
except UserModel.DoesNotExist:
return None
else:
if user.check_password(password):
return user
return None
def get_user(self, user_id):
UserModel = get_user_model()
try:
return UserModel.objects.get(pk=user_id)
except UserModel.DoesNotExist:
return None
```
在 settings.py 中设置 AUTH_USER_MODEL 和 AUTHENTICATION_BACKENDS,例如:
```python
AUTH_USER_MODEL = 'myapp.CustomUser'
AUTHENTICATION_BACKENDS = ['myapp.backends.CustomBackend']
```
最后,在视图中使用 Django 自带的 login() 和 logout() 函数进行登录和退出,例如:
```python
from django.contrib.auth import authenticate, login, logout
from django.shortcuts import render, redirect
def login_view(request):
if request.method == 'POST':
email = request.POST['email']
password = request.POST['password']
user = authenticate(request, email=email, password=password)
if user is not None:
if user.is_staff:
login(request, user)
return redirect('admin:index')
else:
login(request, user)
return redirect('user_home')
else:
return render(request, 'login.html', {'error': 'Invalid credentials'})
else:
return render(request, 'login.html')
def logout_view(request):
logout(request)
return redirect('login')
```
在 login_view 视图中,如果用户是管理员,则重定向到 Django 自带的 admin:index 页面,否则重定向到普通用户的主页。在 logout_view 视图中,使用 Django 自带的 logout() 函数退出登录。