Django: токен CSRF отсутствует или неверен - PullRequest
16 голосов
/ 30 ноября 2011

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

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

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 %}

Я очень озадачен, пожалуйста, скажите мне кое-что попробовать.Спасибо

Ответы [ 3 ]

31 голосов
/ 30 ноября 2011

Вам нужно передать 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 в шаблон.

1 голос
/ 03 августа 2017

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

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

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

Однако, если вы используете декораторы кеша для отдельных представлений, CSRF промежуточное ПО еще не сможет установить заголовок Vary или Файл cookie CSRF, и ответ будет кэширован без одного из них. В в этом случае для любых представлений, для которых требуется вставить токен 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):
    ...
1 голос
/ 02 февраля 2017

Мой ответ похож на ответ @Yugal Jindle выше.

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

return render_to_response(param1, param2)

в

return render(request, param1, param2)

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

'django.middleware.csrf.CsrfViewMiddleware'
...