У меня есть простая страница, где пользователь может выбрать из некоторого списка, и, нажав кнопку «Отправить», можно загрузить CSV-файл, сгенерированный на лету, в соответствии с выбором.
Я следую примерам и учебникам, предоставленным официальным веб-сайтом Django (Django версия 2.1, Python 3.6)
в mytemplate.htm:
<div>
<form action="{% url 'myurl_to_downloadcsvView' %}" method="post">
{% csrf_token %}
{% for obj in object_list %}
<input type="radio" name="myname" id="choice{{ forloop.counter }}" value="{{ obj.pk }}">
<label for="choice{{ forloop.counter }}"> {{ obj.name }}</label><br>
{% endfor %}
<input type="submit" value="Download">
</form>
</div>
в views.py:
class ListView(ListView):
template_name = 'mytemplate.htm'
model = mymodel
def downloadcsvView(request):
blahblah (something I create on the fly)
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="somefilename.csv"'
writer = csv.writer(response)
for r in blahblah:
writer.writerow(r)
return response
в settings.py:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
Когда я тестирую его с сервером разработки (то есть manage.py runserver), он работает, но когда я запускаю сервер Apache, при нажатии кнопки отправки я получаю ошибку: FORBIDDEN (403) 'Ошибка проверки CSRF. Запрос отменен. Причина, приведенная для сбоя: файл cookie CSRF не установлен.
Я могу «решить» это, только поставив @csrf_exempt перед «downloadcsvView».
Как я могу заставить его работать и с производственным сервером?