Django: токен CSRF отсутствует или неверен

Ошибка находится в местоположении http://127.0.0.1:8000/fileupload/form.py

У меня есть версия 1.3 django. Я пробовал указать localhost: 8000, как указано в чьем-то вопросе, но это не сработало для меня. Я пытаюсь иметь форму загрузки файла, но я получаю сообщение об ошибке, что form.py не имеет токена CSRF.

form.py:

class UploadFileForm(forms.Form):

    title = forms.CharField(max_length=50)
    file  = forms.FileField()

views.py:

def upload_file(request):

    c = {}
    c.update(csrf(request))

    if (not request.user.is_authenticated()) or (request.user == None):
      return HttpResponseRedirect("/?error=11")


    if request.method == 'POST':
      form = c['UploadFileForm'] = UploadFileForm(request.POST, request.FILES,  c, context_instance=RequestContext(request))

      if c['UploadFileForm'].is_valid():
        handle_uploaded_file(request.FILES['file'])
        return HttpResponseRedirect('/success/url/')

    else:
        form = c['UploadFileForm'] = UploadFileForm()
    return render_to_response('fileupload/upload.html', {'form': c['UploadFileForm']})

upload.html:

{% block main_content %}


  <form action="fileupload/form.py" enctype="multipart/form-data" method="POST">
    {% csrf_token %}
    <table>

      <tr><td>Title:</td><td><input type="text" name="title" /></td></tr>
      <tr><td>File:</td><td><input type="file" name="file" /></td></tr>
    </table>
      <input type="submit" value="Submit" class = "float_right button_input" />

  </form> 

{% endblock main_content %}

Я очень озадачен, пожалуйста, скажите мне несколько вещей, чтобы попробовать. Благодарю вас.

Ответы

Ответ 1

Вам нужно передать RequestContext в render_to_response для csrf_token

Для этого: (views.py)

from django.template import RequestContext

...

return render_to_response('fileupload/upload.html', {'form': c['UploadFileForm']},  RequestContext(request))
# Added RequestContext

Это передает токен для csrf в шаблон.

Ответ 2

Мой ответ аналогичен ответу @Yugal Jindle выше.

Я использую Django 1.10, и у меня была аналогичная проблема, она работала для меня после редактирования

return render_to_response(param1, param2)

к

return render(request, param1, param2)

P.S. Убедитесь, что в вашей переменной MIDDLEWARE указана нижняя строка в параметрах settings.py

'django.middleware.csrf.CsrfViewMiddleware'

Ответ 3

Это может случиться, если вы используете декораторы @cache_page(60 * 15). Если вы кешируете страницу с формой, содержащей токен CSRF, вы будете кэшировать токен CSRF только для первого пользователя. Поэтому его иногда трудно отлаживать.

Дополнительная информация от Документация Django

Если шаблон шаблона csrf_token используется шаблоном (или get_tokenфункция называется другим способом), CsrfViewMiddleware добавит cookie и заголовок Vary: Cookie. Это означает, что промежуточное программное обеспечение будет хорошо работать с промежуточным программным обеспечением кеша, если оно используется как ( UpdateCacheMiddleware идет перед любым другим промежуточным программным обеспечением).

Однако, если вы используете декораторы кеша для отдельных представлений, CSRF промежуточное ПО еще не смогло установить заголовок Vary или CSRF cookie, и ответ будет кэшироваться без одного. В этот случай, для любых представлений, для которых требуется вставить токен CSRF вы должны использовать django.views.decorators.csrf.csrf_protect()сначала декоратор:

from django.views.decorators.cache import cache_page
from django.views.decorators.csrf import csrf_protect

@cache_page(60 * 15)
@csrf_protect
def my_view(request):
    ...