CORS на одной конечной точке Django

#django

#django

Вопрос:

Я новичок в Django, и у меня есть 2 конечные точки в REST API:

 api.myapp.com/PUBLIC/
api.myapp.com/PRIVATE/
 

Как следует из названий, /PUBLIC конечная точка открыта для всех. Однако я хочу /PRIVATE , чтобы конечная точка принимала вызовы только от myapp.com (моего интерфейса). Как я могу это сделать? Спасибо!

Ответ №1:

Не зная, как настроены ваши приложения и серверы, я думаю, вы можете решить эту проблему с помощью пакета django-cors-headers. Я просмотрел все прочитанное мной, и сигналы внизу выглядят как решение вашей проблемы. Эта часть здесь:

Общий вариант использования сигнала — разрешить всем источникам доступ к подмножеству URL-адресов, в то же время позволяя обычному набору источников получать доступ ко всем URL-адресам. Это невозможно, используя только обычную конфигурацию, но это может быть достигнуто с помощью обработчика сигналов.

Сначала установите CORS_ALLOWED_ORIGINS в список надежных источников, которым разрешен доступ к каждому URL-адресу, а затем добавьте обработчик в check_request_enabled, чтобы разрешить CORS независимо от источника для неограниченных URL-адресов. Например:

 # myapp/handlers.py from corsheaders.signals import check_request_enabled

def cors_allow_api_to_everyone(sender, request, **kwargs):
    return request.path.startswith('/PUBLIC/')

check_request_enabled.connect(cors_allow_api_to_everyone)
 

Таким образом, в большинстве случаев django-cors-headers устанавливаются в качестве опции для всего проекта, но, похоже, здесь есть способ разрешить доступ к подмножеству вашего api ( /PUBLIC в вашем случае) для всех, но остальное является частным.

Таким образом, ваша конфигурация будет

 CORS_ALLOWED_ORIGINS = [
    "https://myapp.com",
]
 

Это позволяет myapp.com чтобы достичь всего.
cors_allow_api_to_everyone это функция, проверяющая значение истинности.
Если это true, запрос разрешен.
check_request_enabled.connect(cors_allow_api_to_everyone) подключает вашу функцию проверки истинности к сигналу django-cors-headers.

Комментарии:

1. Я обновил свой ответ для вас обоих. Вам все равно придется прочитать документы по django-cors-headers Nick, но я выделил ту часть, которую считаю наиболее важной для вас. Если вы новичок в signals в django, это также может стоить прочитать, так что это не слишком волшебно.