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

Django возвращает ошибку 403 при отправке запроса POST

когда я использую следующий код Python для отправки запроса POST на мой сайт Django, я получаю 403: Запрещенная ошибка.

url = 'http://www.sub.domain.com/'
values = { 'var': 'test' }

try:
    data = urllib.urlencode(values, doseq=True)
    req = urllib2.Request(url, data)
    response = urllib2.urlopen(req)
    the_page = response.read()
except:
    the_page = sys.exc_info()
    raise

Когда я открываю любой другой сайт, он работает правильно. domain.com также является сайтом Django, и он работает правильно. Я думаю, что проблема с конфигурацией Django, может ли кто-нибудь сказать мне, что мне делать, чтобы предоставить доступ к моему script?

4b9b3361

Ответ 1

Есть ли представление, которое вы публикуете, чтобы иметь на нем форму Django? Если это так, мне интересно, дает ли она ошибку csrf. Я думаю, что это проявляется как 403. В этом случае вам нужно добавить тег {{csrf_token}}. Просто мысль.

Ответ 2

Посмотрите https://docs.djangoproject.com/en/dev/ref/csrf/#how-to-use-it.

Попробуйте пометить свой вид с помощью @csrf_exempt. Таким образом, промежуточное ПО Django CSRF будет игнорировать защиту CSRF. Вам также потребуется использовать from django.views.decorators.csrf import csrf_exempt. См.: https://docs.djangoproject.com/en/dev/ref/csrf/#utilities

Обратите внимание, что, отключив защиту CSRF на вашем представлении, вы открываете ворота для атак CSRF.

Если вам важна безопасность, рассмотрите возможность использования @csrf_exempt, а затем @requires_csrf_token (см. https://docs.djangoproject.com/en/dev/ref/csrf/#unprotected-view-needs-the-csrf-token). Затем в вашем script передайте этот токен и его.

Ответ 3

Ответ равен 403, поскольку django требует токена csrf (включенного в данные сообщения) в каждом запросе POST, который вы делаете.

Существуют различные способы сделать это, например:

Приобретение маркера из cookie и метода объяснено в статье, введите ссылку здесь

или

Вы можете получить доступ к нему из DOM с помощью {{csrf_token}}, доступного в шаблоне

Итак, теперь, используя второй метод:

var post_data = {
  ...
  'csrfmiddlewaretoken':"{{ csrf_token }}"
  ...
}

$.ajax({
  url:'url',
  type:'POST'
  data:post_data,
  success:function(data){
    console.log(data);
  },
  error:function(error){
    console.log(error);
  }
});

Ответ 4

Или вы можете разрешить разрешение на этот почтовый запрос.

Примечание. Следует использовать в тех случаях, когда вам не требуется аутентифицировать пользователей для публикации чего-либо на нашем сервере, скажем, когда новый пользователь регистрируется в первый раз.

from rest_framework.permissions import AllowAny

class CreateUser(APIView):
    permission_classes = (AllowAny,)
    def post(self, request, format=None):
        return(Response("hi"))

Далее Обратите внимание, что если вы хотите, чтобы этот почтовый запрос формировал другой домен (в случае, если передняя часть приложения находится в режиме React или angular, а бэкэнд - в Django), убедитесь, что добавление следующего в файл настроек:

  • Обновите INSTALLED_APPS, чтобы использовать "coreHeaders":

    INSTALLED_APPS = [
          'corsheaders',
       ]

  • Белый список вашего домена переднего плана, добавив следующее в файл настроек еще раз:

    CORS_ORIGIN_WHITELIST = ( 'Локальный: 8080', )

Ответ 5

Документация Django предоставляет несколько способов обеспечения включения токенов CSRF. Подробнее см. https://docs.djangoproject.com/en/1.11/ref/csrf/.

Ответ 6

Я получил эту ошибку, когда токен аутентификации истек, или когда токен не был отправлен с запросом. Исправлена ​​проблема с обновленным токеном.

curl -X POST -H "Authorization: Token mytoken" -d "name=myname&age=0" 127.0.0.1:8000/myapi/

или

curl -X POST -H "Authorization: JWT mytoken" -d "name=myname&age=0" 127.0.0.1:8000/myapi/

в зависимости от типа токена.