2015-06-10 6 views
1

Невозможно определить этот вариант. Проверка CSRF отлично работает во всех моих шаблонах Django. Здесь я пытаюсь отправить сообщение с клиента python, используя методы, которые я нашел в других сообщениях. Вызов client.get (url) предоставляет токен (например, отладчик показывает: client.cookies ['csrftoken'] = 'POqMV69MUPzey0nyLmifBglFDfBGDuo9'), но request.post() терпит неудачу с ошибкой 403, проверка CSRF не удалась. Что происходит?Проверка CSRF не выполняется на request.post()

Мои Джанго вид (с некоторой фиктивной вещи в методах):

class CameraUpload(View): 
    template_name = "account/templates/upload.html" 

    def get(self, request): 
     dummy = VideoForm() 
     return render(request, self.template_name, {'form': dummy}) 

    def post(self, request): 
     dummy = VideoForm() 
     return render(request, self.template_name, {'form': dummy}) 

И клиент, который пытается сделать пост:

import requests 

url = 'http://127.0.0.1:8000/account/camera_upload/' 

client = requests.session() 
client.get(url) 
csrftoken = client.cookies['csrftoken'] 

payload = { 
    'csrfmiddlewaretoken': csrftoken, 
    'tag': '69' 
} 

r = requests.post(url, data=payload) 

EDIT:

попытался добавить referer согласно this link, поэтому код теперь выглядит так:

r = requests.post(url, data=payload, headers=dict(Referer=url)) 

но такой же проблема есть.

+0

у вас есть дополнительные предисловие слэш в вашем URL ака '/' Вы, вероятно, следует удалить, что –

+0

, что слэш должен быть там. Удаление этого объекта приводит к следующей ошибке: «Вы вызываете этот URL через POST, но URL-адрес не заканчивается косой чертой, и у вас установлен APPEND_SLASH. Django не может перенаправлять URL-адрес косой черты при сохранении данных POST ...» – Gadzooks34

+0

ну тогда следующий вопрос будет, почему у вас установлен 'APPEND_SLASH'? дополнительная косая черта обычно может повредить вещи особенно на переднем конце (javascript и т. д.) .. но я предполагаю, что, поскольку у вас есть это как настройка, это нормально? однако, не лучшая практика. моя догадка о том, что является неправильным, каждый раз, когда вы делаете запрос, устанавливаете файл cookie/сертификат, поэтому отправка одного из предыдущего запроса испортила следующий запрос .. но я не знаю, что предусмотрено. –

ответ

3

Вы должны использовать сеанс (client) на должность:

r = client.post(url, data=payload, headers=dict(Referer=url)) 
+0

Спасибо! Это оказалось именно моей проблемой –

Смежные вопросы