it-roy-ru.com

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

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

14
user1072646

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

30
Yugal Jindle

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

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

return render_to_response(param1, param2)

в

return render(request, param1, param2)

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

'Django.middleware.csrf.CsrfViewMiddleware'
1
Mr.A

Это также может произойти, если вы используете @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):
    ...
0
varren