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 далее в файле настроек:
-
обновите INSTALLED_APPS, чтобы использовать 'coreHeaders':
INSTALLED_APPS = [
'corsheaders',
] -
белый список вашего домена переднего плана, добавив следующее в файл настроек снова:
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/
в зависимости от типа маркера.