2010-12-28 74 views
20

Bir eğitmenden basit bir form oluşturmaya çalışırken CSRF doğrulama başarısız mesajı alıyorum.Django - CSRF doğrulaması başarısız oldu

: Ben bildiğim kadarıyla size html olanlar csrf_token etiketlerden biri gerekiyor, ama ben

İşte benim şablon olduğunu yoksa bunu kullanmak için aslında ne CSRF doğrulama içine küçük bir araştırma yaptım ve contact.html

İşte

bulunan

<form action="/testapp1/contact/" method="post"> 
    {{ form.as_p }} 
    <input type="submit" value="Submit" /> 
</form> 

Oldukça basit, benim urlconf var: django.conf.urls.defaults dan içe *

urlpatterns=patterns('testapp1.views', 
    (r'^$', 'index'), 
    (r'^contact/$','contact') 
) 

Uygulama adı testapp1. URL'mi yazdığımda (http: // localhost: 8000/testapp1/contact), doğru şekilde forma giderim. Sonra formu gönderdiğimde doğrulama hatasını alıyorum.

def contact(request): 
    if request.method == 'POST': # If the form has been submitted... 
     form = ContactForm(request.POST) # A form bound to the POST data 
     if form.is_valid(): # All validation rules pass 
      subject = form.cleaned_data['subject'] 
      message = form.cleaned_data['message'] 
      sender = form.cleaned_data['sender'] 
      cc_myself = form.cleaned_data['cc_myself'] 
      recipients = ['[email protected]'] 
      if cc_myself: 
       recipients.append(sender) 
      print 'Sending Mail:'+subject+','+message+','+sender+','+recipients 
      return HttpResponseRedirect('/thanks/') # Redirect after POST 
    else: 
     form = ContactForm() # An unbound form 

    return render_to_response('contact.html', { 
     'form': form, 
    }) 

cevap

30

: Ben alakalı olduğunu sanmıyorum rağmen

İşte manzara. içindeki {% csrf_token %}şablondaki form etiketini içerir.

. Django 1.4 için

return render(request, 'contact.html', {form: form}) 
+0

Ya ben sadece GOTTE vardı: mytemlate.html

from django.shortcuts import render_to_response from django.template import RequestContext def my_view(request): return render_to_response('mytemplate.html', context_instance=RequestContext(request)) 

Bunu yapmak için n. CSRF korumasının isteğe bağlı olduğunu sanıyordum. Görünüşe göre bir form gönderirseniz CSRF'yi kullanmak için İHTİYACINIZ veya işe yaramaz. Oh iyi. Teşekkürler – JPC

+2

@JPC: yapılandırmanıza bağlı. CSRF katman yazılımını, 'csrf_excempt' dekoratörünü kullanmadığınız sürece gerekli olandan kullanırsanız. Kullanmıyorsanız, 'csrf_protect' dekoratörünü kullanmadığınız sürece gerekli değildir. – Wolph

+1

Ayrıca, django.template import RequestContext'den içe aktarmanız gerekir – northben

2

ayarları: render_to_response içinde

return render_to_response('contact.html', {'form': form}, 
        context_instance=RequestContext(request)) 

[güncelleme]

Bugünlerde (daha az yazarak aynı etki) render yerine render_to_response kullandığınız bir RequestContext kullanın. py

MIDDLEWARE_CLASSES = (
... 
'django.middleware.csrf.CsrfViewMiddleware', 
) 

view.py

from django.template.defaulttags import csrf_token 
from django.shortcuts import render 

@csrf_token 
def home(request): 
    """home page""" 
    return render(request, 
     'template.html', 
      {} 
    ) 

template.html

<form action=""> 
    {% csrf_token %} 
.... 
</form> 
3

views.py:

<form action="/someurls/" method="POST">{% csrf_token %} 
İlgili konular