Ответ 1
Есть ли представление, которое вы публикуете, чтобы иметь на нем форму Django? Если это так, мне интересно, дает ли она ошибку csrf. Я думаю, что это проявляется как 403. В этом случае вам нужно добавить тег {{csrf_token}}. Просто мысль.
когда я использую следующий код 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?
Есть ли представление, которое вы публикуете, чтобы иметь на нем форму Django? Если это так, мне интересно, дает ли она ошибку csrf. Я думаю, что это проявляется как 403. В этом случае вам нужно добавить тег {{csrf_token}}. Просто мысль.
Посмотрите 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 передайте этот токен и его.
Ответ равен 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);
}
});
Или вы можете разрешить разрешение на этот почтовый запрос.
Примечание. Следует использовать в тех случаях, когда вам не требуется аутентифицировать пользователей для публикации чего-либо на нашем сервере, скажем, когда новый пользователь регистрируется в первый раз.
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', )
Документация 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/
в зависимости от типа токена.