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

6 ответов


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


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

попробуйте пометить свой вид с @csrf_exempt. Таким образом, промежуточное ПО CSRF Django будет игнорировать защиту 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) - ... Затем в вашем скрипте передайте этот токен и все.


ответ 403, потому что django требует токена csrf (включенного в данные post) в каждом запросе 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);
  }
});

или вы можете разрешить разрешение на выполнение этого запроса post.

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

from rest_framework.permissions import AllowAny

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

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

  1. обновите INSTALLED_APPS, чтобы использовать 'coreHeaders':

    INSTALLED_APPS = [
    'corsheaders',
    ]

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

    CORS_ORIGIN_WHITELIST = ( 'localhost: 8080', )


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


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

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/

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