Django + CSRF

Odpowiedz Nowy wątek
2011-07-13 03:43
0

Postanowiłem liznąć Pythona i Django więc przerabiam sobie ten samouczek:
http://www.django.pl/documentation/tutorial04/

No ale nie wyrabiam już z CSRF, gogluje, próbuję i nie działa (na Django 1.3). Jest tu ktoś obeznany z tym ? Chodzi o błąd "CSRF verification failed. Request aborted."
Jak coś to wrzucam kod :>

<h1>{{ poll.question }}</h1>
 
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
 
<form action="/polls/{{ poll.id }}/vote/" method="post">{% csrf_token %}
{% for choice in poll.choice_set.all %}
    <input type="radio" name="choice"
        id="choice{{ forloop.counter }}"
        value="{{ choice.id }}"
    />
    <label for="choice{{ forloop.counter }}">{{ choice.choice }}</label><br />
{% endfor %}
<input type="submit" value="Głosuj" />
</form>
def vote(request, poll_id):
    p = get_object_or_404(Poll, pk=poll_id)
    try:
        selected_choice = p.choice_set.get(pk=request.POST['choice'])
    except (KeyError, Choice.DoesNotExist):
        # Pokaz ponownie formularz do glosowania.
        return render_to_response('polls/detail.html', {
            'poll': p,
            'error_message': "Nie wybrales zadnej opcji",
        })
    else:
        selected_choice.votes += 1
        selected_choice.save()
        # Zawsze zwróć HttpResponseRedirect po udanym obsłużeniu danych z POST.
        # To zapewnia, że dane nie zostaną wysłane dwa razy, jeżeli użytkownik
        # kliknie w przeglądarce przycisk Wstecz .
        return HttpResponseRedirect(reverse('mysite.polls.views.results',
                                             args=(p.id,)))
edytowany 1x, ostatnio: maciejmt, 2011-07-13 03:46

Pozostało 580 znaków

2011-07-13 08:18
bo
0

Też się od tygodnia uczę Django. Używam czegoś takiego (prócz {% csrf_token %}):

def main_page(request):
   c = {}
   c.update(csrf(request))
   ....
   output=template.render(variables)
   response=HttpResponse(output)
   response.set_cookie("csrftoken",c)
   return response

Pozostało 580 znaków

2011-07-13 14:03
0

heh, udało mi się.

Powinienem przecież to uwzględnić dla widoku, który renderuje formularz :|

Rozwiązanie dla potomnych (dodałem context_instance=RequestContext(request)):

def detail(request, poll_id):
    p = get_object_or_404(Poll, pk=poll_id)
    return render_to_response('polls/detail.html', {'poll': p}, context_instance=RequestContext(request))

A takie pytanie dodatkowe: jak ustawić domyślnie UTF-8 ?
Na każdym skrypcie robię na początku # -- coding: utf-8 -- , oczywiście jest kodowany jako UTF-8 i tak działa. Bez tego nagłówka, pomimo że w settings.py ustawiam DEFAULT_CHARSET = 'utf-8' to nie działa.

edytowany 1x, ostatnio: maciejmt, 2011-07-13 14:15

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0