Django实现rest_framework与admin共用/login统一登录页的需求
实现Django Admin与DRF共用/login登录页并按角色重定向
1. 自定义登录视图
创建继承自Django内置LoginView的自定义视图,重写get_success_url实现按用户角色跳转的逻辑:
# 你的app的views.py文件 from django.contrib.auth.views import LoginView from django.urls import reverse_lazy class CustomLoginView(LoginView): # 使用Django默认登录模板,可替换为自定义模板路径 template_name = 'registration/login.html' def get_success_url(self): # 超级用户登录后跳转至admin控制台 if self.request.user.is_superuser: return reverse_lazy('admin:index') # 普通用户跳转至/foo页面 return reverse_lazy('foo')
2. 配置URL路由
将自定义/login路由放在admin.site.urls之前,确保覆盖admin默认登录路由;同时配置DRF跳转指向该页面:
# 项目根urls.py文件 from django.contrib import admin from django.urls import path, include from .views import CustomLoginView from django.contrib.auth.views import LogoutView urlpatterns = [ # 自定义登录路由,优先级高于admin path('login/', CustomLoginView.as_view(), name='login'), # 自定义登出路由(可选,统一登出后跳转登录页) path('logout/', LogoutView.as_view(next_page='/login'), name='logout'), # Admin控制台路由 path('admin/', admin.site.urls), # DRF路由(其默认登录/登出会自动跳转到我们的自定义页面) path('api/', include('rest_framework.urls')), # 普通用户跳转目标路由(需保证name='foo'与视图中reverse_lazy对应) path('foo/', your_foo_view, name='foo'), ]
3. 全局配置(关键)
在项目settings.py中设置全局登录跳转地址,让DRF自动使用/login页面:
# settings.py文件 LOGIN_URL = '/login' # 可选:登出后默认跳转回登录页 LOGOUT_REDIRECT_URL = '/login'
4. 模板说明(可选)
若使用自定义登录模板,只需包含Django登录表单渲染逻辑即可:
<!-- templates/registration/login.html --> <form method="post"> {% csrf_token %} {{ form.as_p }} <button type="submit">登录</button> </form>
配置完成后:
- Admin和DRF的登录请求都会跳转到
/login页面 - 登录成功后,超级用户自动进入admin控制台,普通用户跳转至
/foo - 登出操作统一跳回
/login页面
内容的提问来源于stack exchange,提问作者omega royal
相关产品推荐
相关产品推荐

