У меня есть базовый DRF API, встроенный в базовое приложение Django, размещенный на Apache 2.4.
В конфигах Apache я даю авторизацию / доступ к приложению любому, кто находится на нашем локальном сервере, с дополнительной базовой настройкой аутентификации (для тестирования), позволяющей API-вызову с внешнего сервера взаимодействовать с некоторыми моделями.
Когда я делаю GET-запрос к самому приложению с учетными данными Basic Auth, я получаю ответ 200 с содержимым (мне отказывают, если я не включаю учетные данные). Но когда я делаю запрос GET к конечной точке API DRF, я получаю 401 несанкционированный ответ. 401 предполагает, что ответ не проходит проверку подлинности.
Мой вопрос - почему (или как) вызов API-интерфейса, ориентированный на DRF, ищет учетные данные для аутентификации в другом месте, чем вызов самого приложения django (если это действительно происходит)?
Конфигурация Apache выглядит следующим образом:
DocumentRoot /var/www/html
LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so
WSGIDaemonProcess portal python-home=/home/bio_admin/envs/dj python-path=/var/www/portal/html/bpp
WSGIScriptAlias /portal /var/www/portal/html/bpp/bioworks/wsgi.py process-group=portal
WSGIProcessGroup portal
WSGIPassAuthorization On
Alias /static/ /var/www/portal/html/bpp/static/
<Directory /var/www/portal/html>
AuthType Basic
AuthName "portal"
AuthUserFile "/var/www/portal/html/.htpasswd"
Require user bio_admin
Require ip 74.xxx.xxx.x
</Directory>
Часть DRF файла settings.py
выглядит следующим образом:
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES' : (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.BasicAuthentication',
)
}
urls.py
для конечной точки API, а также для конечной точки, которая возвращает 200 с правильным аутентификацией:
from rest_framework.urlpatterns import format_suffix_patterns
urlpatterns = [
path('projects/', views.ProjectsListView.as_view(), name='projects'),
path('api/projects/', views.projectListAPI.as_view())
]
urlpatterns = format_suffix_patterns(urlpatterns)
views.py
класс для рассматриваемого API:
class projectDetailAPI(generics.RetrieveUpdateDestroyAPIView):
queryset = Project.objects.all()
serializer_class = ProjectSerializer