Django единая страница входа для rest_framework и консоли администратора
Я делаю Django-приложение, которое использует rest_frameworks (под urlpattern '/api') и консоль администратора (для управления пользователями и группами, под urlpattern '/admin'). В настоящее время они оба имеют свою собственную страницу входа. Я хочу, чтобы обе они использовали одну и ту же страницу входа (единый URL), и если пользователь успешно вошел, то, если это суперпользователь, он перенаправлялся на консоль администратора, а если не суперпользователь, то перенаправлялся на '/foo'.
Я знаю, что можно вставить шаблон url над admin.site.urls, чтобы переопределить его шаблоны url для входа (и выхода), но я хочу, чтобы страница входа была '/login', а не '/admin/login'.
Чтобы получить общую страницу входа в систему для представлений фреймворка Django REST и консоли администратора Django, вы можете создать пользовательское представление аутентификации и направлять все запросы на вход в систему в это представление. Затем в пользовательском представлении аутентификации вы можете проверить, является ли пользователь суперпользователем, и перенаправить его соответствующим образом.
Вот общий подход, которого вы можете придерживаться:
- Создайте пользовательское представление аутентификации:
Создайте новое представление для аутентификации, например, в файле views.py:
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login
def custom_login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
if user.is_superuser:
return redirect('/admin/')
else:
return redirect('/foo/')
else:
# Handle invalid login credentials
pass
return render(request, 'custom_login.html')
- Обновление шаблонов URL:
Обновите файл urls.py, чтобы включить в него пользовательское представление входа и направить на него запросы входа.
from django.contrib import admin
from django.urls import path
from .views import custom_login
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('your_api_app.urls')),
path('login/', custom_login, name='custom_login'),
]
Эта конфигурация предполагает, что у вас есть отдельный urls.py для вашего API (your_api_app.urls). Настройте его в соответствии со структурой вашего проекта.
Теперь, когда пользователи пытаются получить доступ к консоли администратора или вашему REST API и не проходят аутентификацию, они будут перенаправлены на URL /login. После успешного входа суперпользователи будут перенаправлены на /admin/, а остальные - на /foo/. Настройте URL и логику в соответствии с вашими требованиями.