Я переписал пользовательскую модель пользователя так, что я могу войти в систему, используя электронную почту вместо имени пользователя, и чтобы я мог перенаправить на changepassword при первом входе в систему.
def login_view(request):
if request.method == 'POST':
form = AuthenticationForm(data=request.POST)
if form.is_valid():
user = form.get_user()
if user.last_login is None:
login(request, user)
return redirect('accounts:change_password')
else:
login(request, user)
return redirect('home')
else:
form = AuthenticationForm()
if request.user.is_authenticated:
return redirect('home')
else:
return render(request, 'login.html', {'form': form})
Я настроил базовую конечную точку API покоя, используя DRF
class UserViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows users to be viewed or edited.
"""
queryset = User.objects.all()
serializer_class = UserSerializer
Когда я захожу на домашнюю страницу, мне нужно войти в систему:
@login_required(login_url="/accounts/login/")
def home(request):
return render(request, 'index.html', {})
Я хотел бы пройти аутентификацию с использованием django.contrib.auth и перенаправить на домашнюю страницу.
Когда загружается домашняя страница, я хотел бы выполнить вызов AJAX для отображения всех пользователей.
$.ajax(
{
type: "GET",
url: '/accounts/users/',
success: function(result){
console.log(result);
}
});
Этот вызов должен работать, только если я уже вошел в систему со своим пользователем.
Если я получаю доступ к конечной точке извне, скажем, в Почтальоне, она должна попросить меня пройти аутентификацию.
Я должен иметь возможность проходить внешнюю аутентификацию в почтальоне, используя аутентификацию токена.
Вопрос:
Как я могу смешать аутентификацию django.contrib.auth с аутентификацией токена Django rest_framework, как описано выше? Я хотел бы иметь веб-приложение и REST API одновременно. Выполните аутентификацию в веб-приложении, используя django.contrib.auth. Выполните аутентификацию в REST API с помощью токена. Но если пользователь уже вошел в веб-приложение, выполните запрос API Rest без необходимости повторной аутентификации. Можно ли как-то повторно использовать сеанс веб-приложения?
Уже настроил мою модель пользователя:
https://docs.djangoproject.com/en/2.1/topics/auth/customizing/
Посмотрели на это, еще не начали внедрять. Я не уверен, как они могут подключиться.
https://www.django -rest-framework.org / апи-гид / аутентификации / # tokenauthentication
Решение
Я принял ответ ниже, хотя тем временем нашел решение. Я предположил, что вы можете добавить только один метод аутентификации, но вы можете иметь больше. То, что я фактически закончил, было:
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
)
Работает как шарм. В моем случае разрешение IsAuthenticated применяется глобально. В принятом ответе применяется к конечной точке