Подтвердить что ты не робот

"Нет заголовка" Access-Control-Allow-Origin "присутствует на запрошенном ресурсе" в django

Я новичок в django и использую его в качестве задней части для приложения, которое создает пользователей. На лицевой стороне кода для отправки имени пользователя:

var xobj = new XMLHttpRequest();
              xobj.overrideMimeType("application/json");
              xobj.open('POST', "http://www.local:8000/create_user/", true);
                xobj.setRequestHeader("Access-Control-Allow-Origin", "*");
              xobj.onreadystatechange = function () {
                  if (xobj.readyState == 4 && xobj.status == "200") {
                      console.log(xobj.responseText);
                  }
            }
              xobj.send(json);    

На задней части функция, связанная с url, обрабатывает json, но я получаю ошибку Заголовок "Нет" Access-Control-Allow-Origin присутствует на запрошенном ресурсе. Поэтому "http://www.local:54521" не разрешен доступ". Каково решение этой проблемы? Также я выполнил шаги из https://gist.github.com/strogonoff/1369619, но проблема не устранена.

4b9b3361

Ответ 1

Ваш передний и задний разъемы находятся на разных портах, что означает, что ваши запросы ajax могут быть защищены от перекрестного происхождения.

Вам нужно настроить задний конец, чтобы принимать запросы с разных источников (или только разные номера портов).

Попробуйте прочитать CORS и более конкретно посмотреть заголовки django cors

Ответ 2

Вот что я сделал, когда получил ту же ошибку от Django Rest Framework при отправке запроса API от Restangular. Это добавляет заголовки CORS (Cross-Origin Resource Sharing) к ответам от Django Rest Framework. Отсутствие заголовков CORS стало причиной ошибки.

В корневой папке проекта Django (где находится файл manage.py) выполните:

pip install django-cors-headers

Я попробовал его с помощью virtualenv, но не смог заставить его работать, поэтому я установил его, не переключаясь на virtualenv, и установил его.

После его установки вы должны внести некоторые изменения в настройки django.py

INSTALLED_APPS = (
    ...
    'corsheaders',
    ...
)

MIDDLEWARE_CLASSES = (
    ...
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    ...
)

CORS_ORIGIN_ALLOW_ALL = True   

Значение выше true позволяет принимать все источники.

Рекомендации: https://github.com/ottoyiu/django-cors-headers

Ответ 3

В моем случае я просто забыл добавить конечную косую черту в конце URL-адреса API REST. т.е. У меня было это:

http://127.0.0.1:8000/rest-auth/login

Вместо этого:

http://127.0.0.1:8000/rest-auth/login/

Ответ 4

Если django-cors-headers не удалось устранить проблему, попробуйте вручную добавить Access-Control-Allow-Origin следующим образом:

@api_view(['GET'])
def swanger(request):
  resutl = {'a': 1}
  resp = JsonResponse(resutl)
  resp['Access-Control-Allow-Origin'] = '*'
  return resp  

Ответ 5

в моем случае это был localhost: 8000, в то время как ожидалось 127.0.0.1... смена localhost на 127.0.0.1 в моем браузере сделала свое дело

Ответ 6

Добавьте следующую строку в классы промежуточного программного обеспечения

'corsheaders.middleware.CorsPostCsrfMiddleware'

так что общая реализация будет:

INSTALLED_APPS = (
    ...
    'corsheaders',
    ...
)

MIDDLEWARE_CLASSES = (
    ...
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    'corsheaders.middleware.CorsPostCsrfMiddleware'

    ...
)

CORS_ORIGIN_ALLOW_ALL = True   

проверьте документацию ниже для получения дополнительной информации

Ответ 7

Я столкнулся с той же проблемой.

user3785412 ответ будет работать. но в первый раз он может не работать напрямую из-за кэша браузера. попробуйте в другом браузере или очистить кеш, прежде чем терять надежду.

У меня был сервер API в Django 2, размещенный на Heroku и Angular 7 Client на Firebase. Я внес все изменения в settings.py в соответствии с user3785412 и все равно он не будет работать, потратил почти 3 часа. Потом наткнулся на пост, в котором предполагалось, что кеш может быть проблемой. открыл в хроме и вуаля!

Надеюсь это поможет! (Мой первый ответ здесь, пожалуйста, будьте спокойны)