Очевидно, что это не лучшее решение, потому что оно будет циклически просматривать всю мою базу данных моделей. Как я могу сделать этот запрос наиболее эффективным способом?
Здравствуйте, Я работаю над проектом, где я использовал django-rest-knox для аутентификации токенов. У меня есть сомнения, что
1.Как использовать токен, который возвращается при регистрации и входе в систему.
(
когда я передаю токен в postman как, например,
.
в разделе заголовка
Токен аутентификации abcjdkkfjjrhehrjlajn@kfjdk
)
это не работает
2.когда я вызываю конечную точку logout и logoutall, она говорит
{ "detail": "Учетные данные для аутентификации не были предоставлены". }
даже несмотря на то, что я передал все правильные учетные данные.
Вот код, которому я следую,
в файле setting.py
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": (
'knox.auth.TokenAuthentication',
"rest_framework.authentication.BasicAuthentication",
"rest_framework.authentication.SessionAuthentication",)}
REST_AUTH_TOKEN_MODEL = 'knox.models.AuthToken'
REST_AUTH_TOKEN_CREATOR = 'users.authentication.create_knox_token'
REST_AUTH_SERIALIZERS = {
'USER_DETAILS_SERIALIZER': 'users.serializers.CustomUserSerializer',
'TOKEN_SERIALIZER': 'users.serializers.KnoxSerializer'
}
<
path('auth/register/',KnoxRegisterView.as_view(),name='register'),
path('auth/login/',KnoxLoginView.as_view(),name='login'),
path('api/auth/logout/',knox_view.LogoutView.as_view(),name='knox_login'),
path('api/auth/logoutall/',knox_view.LogoutAllView.as_view(),name='knox_alllogin'),
в authentication.py
from knox.models import AuthToken
def create_knox_token(token_model, user, serializer):
token = AuthToken.objects.create(user=user)
return token
в serializers.py
class KnoxSerializer(serializers.Serializer):
"""
Serializer for Knox authentication.
"""
token=serializers.CharField()
user = CustomUserDetailsSettingsSerializer()
в файле views.py
class KnoxRegisterView(RegisterView):
def get_response_data(self, user):
return KnoxSerializer({'user': user, 'token': self.token}).data
def perform_create(self, serializer):
user = serializer.save(self.request)
self.token = create_knox_token(None, user, None)
complete_signup(self.request._request, user, allauth_settings.EMAIL_VERIFICATION, None)
return user
class KnoxLoginView(LoginView):
def get_response(self):
serializer_class = self.get_response_serializer()
data = {
'user': self.user,
'token': self.token
}
serializer = serializer_class(instance=data, context={'request': self.request})
return Response(serializer.data, status=200)
Я не уверен, но думаю, что ваша проблема в том, что вам нужно переопределить представление login, чтобы оно не запрашивало аутентификацию. Обычно rest framework настраивается следующим образом:
# setting.py
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
}
Итак, ваш фреймворк считает, что ему нужна аутентификация для ВСЕХ представлений, включая представление login (что, конечно, глупо). Решение состоит в том, чтобы переписать представление входа в систему как документационное примечание:
Если это ваш единственный класс аутентификации по умолчанию, не забудьте переписать Knox's LoginView, иначе он не будет работать, поскольку представление входа в систему будет требовать токен аутентификации для генерации нового токена, делая его непригодным для использования.
Попробуйте добавить к вашему представлению входа:
class KnoxLoginView(LoginView):
...
permission_classes = (permissions.AllowAny,)
...