Используйте python запросы для входа и загрузки файла на сайт django. ошибка токена csrf - PullRequest
0 голосов
/ 22 марта 2020

У меня есть django веб-сайт, где для загрузки файла необходимо войти в систему. Файл является частью поля формы модели. И логин (авторизация), и выгрузка файлов хорошо работают при запуске прямо из браузера. Однако при использовании python запросов работает только вход в систему и загрузка завершается с ошибкой crsf.

Ниже приведены примеры кода.

forms.py

class DatabaseUploadForm(forms.ModelForm): class Meta: model = Profile fields = ["dbfile"]

загрузка. html

<form method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    <fieldset class="form-group">
        <legend class="border-bottom mb-4">Upload Database</legend>
        {{ p_form}}
    </fieldset>
    <div class="form-group">
        <button class="btn btn-outline-info" type="submit">Update</button>
    </div>
</form>

login_and_upload_script.py

user = "user1"
password="passwrd1"
url_login='http://127.0.0.1:8000/users/login/'
url_upload='http://127.0.0.1:8000/users/upload/'
client = requests.session()
client.get(url_login)
csrftoken = client.cookies['csrftoken']
files={'dbfile':('files.db', open('file.db', 'rb'))}
login_data = {'username':user,'password':password, 'csrfmiddlewaretoken':csrftoken, 'next': 
url_upload}
r1=client.post(url_login,data=login_data)
print(r1.status_code) 
print('\n=================================================================\nLogged In......\nConti')


client.get(url_upload)
csrftoken2 = client.cookies['csrftoken']
files={'dbfile':('MARKSDB.db', open('MARKSDB.db', 'rb')), 'csrfmiddlewaretoken':csrftoken2}
r=requests.post(url_upload, files = files, headers=dict(Referer=url_upload))
print(r.status_code)
print(r.text)
print('\n=================================================================\nDone')

Выход

200

=================================================================
Logged In......
Continue
403

<!DOCTYPE html>


  
  
  403 Forbidden
  
    html * { padding:0; margin:0; }
    body * { padding:10px 20px; }
    body * * { padding:0; }
    body { font:small sans-serif; background:#eee; color:#000; }
    body>div { border-bottom:1px solid #ddd; }
    h1 { font-weight:normal; margin-bottom:.4em; }
    h1 span { font-size:60%; color:#666; font-weight:normal; }
    #info { background:#f6f6f6; }
    #info ul { margin: 0.5em 4em; }
    #info p, #summary p { padding-top:10px; }
    #summary { background: #ffc; }
    #explanation { background:#eee; border-bottom: 0px none; }
  



  Forbidden (403)
  CSRF verification failed. Request aborted.


  You are seeing this message because this site requires a CSRF cookie when submitting forms. This cookie is required for security reasons, to ensure that your browser is not being hijacked by third parties.
  If you have configured your browser to disable cookies, please re-enable them, at least for this site, or for “same-origin” requests.




  Help

    Reason given for failure:
    
    CSRF cookie not set.
    

Как правило, это может произойти, если имеется подлинная подделка межсайтовых запросов или когда механизм CSRF Django не использовался правильно. Для форм POST вам необходимо убедиться:

  • Ваш браузер принимает файлы cookie.
  • Функция просмотра передает request методу render шаблона .
  • В шаблоне есть шаблонный тег {% csrf_token %} внутри каждой формы POST, предназначенный для внутреннего URL.
  • Если вы не используете CsrfViewMiddleware, тогда вы должны использовать csrf_protect на любые представления, использующие тег шаблона csrf_token, а также те, которые принимают данные POST.
  • Форма имеет действительный токен CSRF. После входа в другую вкладку браузера или нажатия кнопки «Назад» после входа в систему может потребоваться перезагрузить страницу с формой, поскольку маркер поворачивается после входа в систему.

Вы видите раздел справки на этой странице, потому что у вас есть DEBUG = True в вашем файле настроек Django. Измените это на False, и будет отображаться только начальное сообщение об ошибке.

Вы можете настроить эту страницу, используя параметр CSRF_FAILURE_VIEW.

==== ================================================== =========== Готово

Как избежать этой ошибки.

Спасибо

1 Ответ

0 голосов
/ 22 марта 2020

у вас тоже должен быть атрибут действия, по умолчанию POST-вызов отправляется на текущий URL-адрес, по которому была обработана форма

<form method="POST" action='' enctype="multipart/form-data">
...