Ошибка Django: проверка CSRF завершилась неудачно только с Apache (не с сервером разработки) - PullRequest
1 голос
/ 26 апреля 2019

У меня есть простая страница, где пользователь может выбрать из некоторого списка, и, нажав кнопку «Отправить», можно загрузить 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».

Как я могу заставить его работать и с производственным сервером?

...