django csrf_token не печатает скрытое поле ввода - PullRequest
7 голосов
/ 12 февраля 2012

my views.py:

from django.core.context_processors import csrf
from django.views.decorators.csrf import csrf_protect
from django.http import *
from django.template import *
from django.shortcuts import *
# Create your views here.
@csrf_protect
def homepage(request):
        return render_to_response('index.html', {'files':os.listdir('/home/username/public_html/posters') })
@csrf_protect
def upload(request):
        return render_to_response('list.html', )

в моем шаблоне index.html:

<html>
<body>
<h1> All uploaded posters: </h1>
<form action='/posters/upload' method= 'POST'>{%csrf_token%}
<input type='file' name= 'uploadfile'>Upload new poster <input type="submit" value = "Upload">
</form>
{%for file in files %}
<a href = 'http://servername/~username/posters/{{file}}'>{{file}}</a> <br />
{%endfor%}
</body>
</html>

поэтому, когда я открываю домашнюю страницу в браузере и вижу исходный код, токена csrf нет!

<html>
<body>
<h1> All uploaded posters: </h1>
<form action='/posters/upload' method= 'POST'>
<input type='file' name= 'uploadfile'>Upload new poster <input type="submit" value = "Upload">
</form>

<a href= ......

Что я пропустил?

ОБНОВЛЕНИЕ : это помогло.

Ответы [ 3 ]

8 голосов
/ 12 февраля 2012

Вам необходимо использовать RequestContext для использования промежуточного программного обеспечения CSRF:

from django.template import RequestContext

# In your view:
return render_to_response('index.html'
    {'files':os.listdir('/home/username/public_html/posters') },
    context_instance=RequestContext(request))

Кстати: использование декоратора csrf_protect не рекомендуется, так как, если вы забудете его использовать, у вас будет дыра в безопасности.

1 голос
/ 12 февраля 2012

Если вы используете 1.3 (что и должно быть), ярлык render предлагает более компактный способ сделать это:

from django.shortcuts import render

def some_view(request):
    return render(request, 'template.html', context_dict)
0 голосов
/ 12 февраля 2012

Пожалуйста, посмотрите фрагмент из документа Django.

Метод декоратора Вместо добавления CsrfViewMiddleware в качестве общей защиты вы можете использовать декоратор csrf_protect, который имеет точно такую ​​же функциональность, в определенных представлениях, которые нуждаются в защите. Он должен использоваться как для представлений, которые вставляют токен CSRF в вывод, так и для тех, которые принимают данные формы POST. (Это часто одна и та же функция представления, но не всегда). Используется так:

from django.views.decorators.csrf import csrf_protect
from django.template import RequestContext

@csrf_protect
def my_view(request):
    c = {}
    # ...
    return render_to_response("a_template.html", c,
                               context_instance=RequestContext(request))

Использование декоратора само по себе не рекомендуется , поскольку, если вы забудете его использовать, у вас будет дыра в безопасности. Стратегия «пояса и фигурных скобок», заключающаяся в использовании обоих методов, хороша и требует минимальных накладных расходов.

...