Я работаю как с самой последней Django 3.0.2, так и с DRF 3.11.0, используя djangorestframework-simplejwt 4.4.0. У меня не было этой проблемы раньше в предыдущем проекте Django 2.2.0 (и более старых версиях lib), но я не могу понять, почему я не могу получить доступ к представлению с установленными разрешениями только для чтения, и аутентификация по умолчанию выглядит нормально в настройках. Для библиотеки simplejwt и firebaseauth я использую настройки по умолчанию (с правильными учетными данными для firebaseauth, проверил, что он работает нормально).
Если я указал в качестве пустого в аутентификации классы authentication_classes, то он работает нормально, но это всего лишь пример. Я ожидал, что настройки по умолчанию будут работать из настроек: если я не прав и должен быть явно установлен таким образом. Я также пытался использовать gunicorn и официантку, и это тот же результат.
Вот вид:
class NoteList(generics.ListAPIView):
"""
List all Notes. Not used
"""
# authentication_classes = []
permission_classes = (permissions.AllowAny,)
serializer_class = NoteSerializer
def get_queryset(self):
notes = Note.objects.all()
return notes
Вот мои настройки:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
REST_FRAMEWORK = {
# When you enable API versioning, the request.version attribute will contain a string
# that corresponds to the version requested in the incoming client request.
'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.NamespaceVersioning',
# Authentication settings
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework_simplejwt.authentication.JWTAuthentication',
'rest_framework.authentication.SessionAuthentication',
'drf_firebase_auth.authentication.FirebaseAuthentication',
],
# Permission settings
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly',
'rest_framework.permissions.IsAuthenticated',
'rest_framework.permissions.IsAdminUser',
'rest_framework.permissions.IsAuthenticatedOrReadOnly',
],
# For unit test cases
'TEST_REQUEST_DEFAULT_FORMAT': 'json',
# Pagination
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE': 50,
}
Если порядок перечисленных выше вопросов имеет значение, каков их правильный порядок?
URL, если он имеет значение:
urlpatterns = [
path('anotes/', NoteList.as_view(), name="lame-notes"),
]
Теперь, когда я посещаю URL-адрес анонимно, я всегда получаю:
GET /v1/anotes/
HTTP 401 Unauthorized
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
WWW-Authenticate: Bearer realm="api"
{
"detail": "Invalid Authorization header format, expecting: JWT <token>."
Я застрял в этой проблеме некоторое время и не смог найти каких-либо подобных проблем для ее решения. В моем старом Django проекте я не получаю 401 Unauthorized и могу работать с ReadOnly корректно. Представление или конечная точка работает правильно только в том случае, если я вошел в систему.
Если мне не хватает какой-либо информации, сообщите мне.