У меня есть 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.
==== ================================================== =========== Готово
Как избежать этой ошибки.
Спасибо