Django возвращает ошибку 403 при отправке запроса POST - PullRequest
34 голосов
/ 23 июля 2011

, когда я использую следующий код 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, может кто-нибудь сказать мне, что я должен сделать, чтобы обеспечить доступ к моему сценарию?

Ответы [ 6 ]

45 голосов
/ 23 июля 2011

Смотрите здесь 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). Затем в вашем скрипте передайте этот токен и все.

28 голосов
/ 23 июля 2011

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

3 голосов
/ 19 июня 2016

Ответ 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);
  }
});
0 голосов
/ 20 декабря 2017

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

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/

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

0 голосов
/ 18 июля 2017

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

0 голосов
/ 07 июня 2017

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

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

from rest_framework.permissions import AllowAny

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

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

  1. Обновите INSTALLED_APPS для использования 'coreHeaders':

    INSTALLED_APPS = [
    'corsheaders',
    ]

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

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

...