проблемы с csrf_token - PullRequest
       10

проблемы с csrf_token

2 голосов
/ 06 октября 2011

Я делаю вики в учебнике по django, и в учебнике используется более ранняя версия django, где токен csrf не является обязательным. Я добавил {% csrf_token%} в форму, однако я не уверен, что делать в представлениях. Пожалуйста, помогите.

Вот форма:

<form method = "POST" action="/wikicamp/{{ page_name }}/save/">{% csrf_token %}
    <textarea name = "content" rows="20" cols="60">{{ content }}</textarea><br/>
    <input type="submit" value="Save Page"/>
</form>

views.py:

def view_page(request, page_name):
    try:
        page = Page.objects.get(pk=page_name)
    except Page.DoesNotExist:
        return render_to_response("create.html", {"page_name" : page_name})

    return render_to_response("view.html", {"page_name" : page_name,
                                            "content" : page.content})

def edit_page(request, page_name):
    c = {}
    c.update(csrf(request))
    try:
        page = Page.objects.get(pk=page_name)
        contents = page.content
    except Page.DoesNotExist:
        content = ""
    return render_to_response("edit.html", {"page_name" : page_name,
                                            "content" : content}, c)


def save_page(request, page_name):
    content = request.POST["content"]
    try:
        page = Page.objects.get(pk=page_name)
        page.content = content
    except Page.DoesNotExist:
        page = Page(name = page_name, content = content)
    page.save()

    return HttpResponseRedirect("/wikicamp/" + page_name + "/")

вот ошибка

TypeError at /wikicamp/start/edit/
pop expected at least 1 arguments, got 0

Ответы [ 2 ]

3 голосов
/ 06 октября 2011

Вы не совсем поняли шаг 3 здесь : вам нужно использовать RequestContext, чтобы убедиться, что процессор контекста запущен.

return render_to_response("edit.html", {"page_name" : page_name,
                                        "content" : content},
                           context_instance=RequestContext(request))

При этом вам не нужен бит c.update(csrf(request)).

0 голосов
/ 06 октября 2011

Вам не нужно больше ничего делать.

Просто поместите {% csrf_token %} в форму и отправьте ее по почте.

Все остальные вещи будут выполнены внутри django.middleware.csrf.CsrfViewMiddleware.

Вы должны включить его в своем settings.py (если вы этого не сделали):

MIDDLEWARE_CLASSES += (`django.middleware.csrf.CsrfViewMiddleware`,)
TEMPLATE_CONTEXT_PROCESSORS += (`django.core.context_processors.csrf`,)

Последняя строка не требуется, если вы используете RequestContext (не просто Context) в ваших шаблонах (Примечание: render_to_response() использует Context, когда direct_to_template() использует RequestContext)

...