Soru Django CSRF Çerez Ayarlanmamış


Bir süredir bir sorunum var, CSRF Çerezini ayarlamıyorum. Lütfen aşağıdaki kodlara bakın

piton

def deposit(request,account_num):
if request.method == 'POST':
    account = get_object_or_404(account_info,acct_number=account_num)
    form_=AccountForm(request.POST or None, instance=account)
    form = BalanceForm(request.POST)
    info = str(account_info.objects.filter(acct_number=account_num))
    inf=info.split()
    if form.is_valid():
    #cd=form.cleaned_data
        now = datetime.datetime.now()
        cmodel = form.save()
        cmodel.acct_number=account_num
        #RepresentsInt(cmodel.acct_number)
        cmodel.bal_change="%0.2f" % float(cmodel.bal_change)
        cmodel.total_balance="%0.2f" %(float(inf[1]) + float(cmodel.bal_change))
        account.balance="%0.2f" % float(cmodel.total_balance)
        cmodel.total_balance="%0.2f" % float(cmodel.total_balance)
        #cmodel.bal_change=cmodel.bal_change
        cmodel.issued=now.strftime("%m/%d/%y %I:%M:%S %p")
        account.recent_change=cmodel.issued
        cmodel.save()
        account.save()
        return HttpResponseRedirect("/history/" + account_num + "/")
    else:
        return render_to_response('history.html',
                          {'account_form': form},
                          context_instance=RequestContext(request))

HTML'de buradaki kod

HTML

<form action="/deposit/{{ account_num }}/" method="post">

<table>
<tr>
{{ account_form.bal_change }}
&nbsp;
<input type="submit" value="Deposit" />
</tr>
{% csrf_token %}
</table>
</form>

Takılı kaldım, zaten çerez temizledim, diğer tarayıcı kullanılmış ama hala csrf tanımlama bilgisi ayarlanmamış.


44
2017-07-18 06:58


Menşei


Sende var mı CsrfViewMiddleware senin içinde MIDDLEWARE_CLASSES Ayar? - alecxe
Eklemek {%csrf_token%} formdaki formunda. - Rohan
@Rohan zaten orada, soruya bakın. - alecxe
Evet, zaten CsrfViewMiddleware'im var ve formumda zaten csrf_token var
Django cors modülünü kullanıyorum ve ReactJS aracılığıyla erişiyorum. (Her ikisi de localhost üzerindeydi). Ayrıca OP'nin bu problemi vardı. Eklediğimi ekledim credentials: 'include' POST isteğine ve ardından Django'nun settings.py dosyasına eklenmesi: CORS_ALLOW_CREDENTIALS = True eklemeye gerek kalmadan sorunu çözmüş görünüyor @csrf_exempt manzaraya. Aslında dokümanlarda ... pypi.org/project/django-cors-headers-multi * Bunun, yukarıdaki sorulardan biriyle ilgili olduğunu biliyorum, ancak henüz yorum yapamıyorum ve bir başkasını, beni bulmam için harcadığı zamanı umarım bir şekilde kurtarmak istedim. - D W


Cevaplar:


Bu da oluşabilir CSRF_COOKIE_SECURE = True ayarlanmış ve siteye güvenli olmayan bir şekilde erişiyorsunuz.


81
2017-09-25 15:04



Teşekkürler! Aynı şey için de geçerli SESSION_COOKIE_SECURE = True. - NonameSL


from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt

@csrf_exempt 
def your_view(request):
    if request.method == "POST":
        # do something
return HttpResponse("Your response")

30
2017-07-29 16:17



Güvenlik mekanizmasının tamamen devre dışı bırakılması, hatayı düzeltmenin iyi bir yolu değildir. - Guillaume Algis
2017 yılında cookiecutter-django kullanıyorsanız, bu üretimde doğru cevaptır. - André Duarte
Neden bu, meraktan kaçıyor? - Patrick Gallagher


Kullanıyorsanız HTML5 Fetch API'sı POST isteklerini giriş yapmış kullanıcı olarak yapmak ve Forbidden (CSRF cookie not set.)Bu varsayılan olarak olabilir fetch oturum çerezlerini içermez, bu da Django'nun sayfayı yükleyen kişiden farklı bir kullanıcı olduğunuzu düşünmesiyle sonuçlanır.

Seçeneği geçerek oturum jetonunu ekleyebilirsiniz. credentials: 'include' getirmek için:

var csrftoken = getCookie('csrftoken');
var headers = new Headers();
headers.append('X-CSRFToken', csrftoken);
fetch('/api/upload', {
    method: 'POST',
    body: payload,
    headers: headers,
    credentials: 'include'
})

8
2018-04-15 00:21



Benim durumumda sorun buydu. Upvoted. - Andre
başlattığınız Header () yönteminin ne olduğunu biliyor olabilir miyim? küresel javascript yöntemidir? - Abz Rockers
@AbzRockers: Evet, Headers HTML5 Fetch API'sinin bir parçası olan küresel bir javascript arabirimidir. developer.mozilla.org/en-US/docs/Web/API/Headers - user85461


itibaren Bu Bunu ekleyerek çözebilirsiniz. warranty_csrf_cookie dekoratör senin görüşüne

from django.views.decorators.csrf import ensure_csrf_cookie
@ensure_csrf_cookie
def yourView(request):
 #...

bu yöntem işe yaramazsa. middleware'de csrf'yi yorumlamaya çalışacaksınız. ve tekrar test edin.


5
2018-06-27 10:40





Bu sorun, Python'un kendisinde bir hata yüzünden yakın zamanda ortaya çıktı.

http://bugs.python.org/issue22931

https://code.djangoproject.com/ticket/24280

Etkilenen versiyonlar arasında 2.7.8 ve 2.7.9 idi. İçerilen değerlerden biri varsa çerez doğru okunmadı [ karakter.

Python (2.7.10) güncellenmesi sorunu giderir.


1
2017-10-08 10:12





Django 1.10 kullanıyordum. Bu problemle karşı karşıya kaldım. Şimdi onu Django 1.9'a düşürdüm ve iyi çalışıyor.


1
2017-08-09 09:45



1.10.3 kullanarak bu sorunu yaşadım. Benim için 1.10.6'ya yükseltildi. - Mike Darmetko


DRF ile çalışırken benzer bir duruma rastladım. Çözüm, urls.py'deki View'a .as_view () yöntemi ekliyordu.


1
2018-03-20 12:21



Ayrıca benim problemimi çöz - jeck yung


settings.py yüklü olup olmadığını kontrol etmeye çalışın

 MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',)

Şablonda veriler csrf_token ile biçimlendirilmiştir:

<form>{% csrf_token %}
</form>

0
2017-07-18 07:14



zaten ikisine de sahipsin ama hala csrf kuralı görüntülenmiyor.
Ben senin tüm kod yok ama mesele burada olduğuna inanıyorum: mevduat (istek, account_num): mevduat (istek) depolamak için değiştirdi: ve account_num geri aramak için bir yol bulmak. şimdi account_num bir tablo alanı veya bir değişken ise bağımlı olacaktır. - drabo2005
Bu bir {{account_num}} değişkendir, ancak bu csrf belirtecini nasıl etkiler?
csrf belirtecinin yalnızca isteğe başvurduğuna inanıyorum, bu nedenle buradaki değişkenin gidişatını doğrulayamaz veya işleyemez. Eğer csrf_token hakkında uygun bir cevap alabilirsiniz djangoproject.com kontrol edin. - drabo2005


Sorun şu ki, işlem görmüyor GET Formu almadan önce uygun şekilde veya doğrudan veriyi gönderir.

Sayfaya ilk eriştiğinizde, müşteri gönderecek GET Bu durumda, uygun formda html göndermeniz gerekir.

Daha sonra, kullanıcı formu doldurur ve gönderir POST form verisi ile istek.

Görüşünüz şöyle olmalı:

def deposit(request,account_num):
   if request.method == 'POST':
      form_=AccountForm(request.POST or None, instance=account)
      if form.is_valid(): 
          #handle form data
          return HttpResponseRedirect("/history/" + account_num + "/")
      else:
         #handle when form not valid
    else:
       #handle when request is GET (or not POST)
       form_=AccountForm(instance=account)

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

0
2017-07-18 08:19



Denedim ama hala çalışmıyor.


Chrome'un çerezlerinin web siteleri için varsayılan seçenekle ayarlandığını kontrol edin. Yerel verilerin ayarlanmasına izin ver (önerilen).


0
2017-08-17 04:18





Yöntem 1:

from django.shortcuts import render_to_response
return render_to_response(
    'history.html',
    RequestContext(request, {
        'account_form': form,
    })

Yöntem 2:

from django.shortcuts import render
return render(request, 'history.html', {
    'account_form': form,
})

Render_to_response yöntemi, yanıt tanımlama bilgilerinin bazı sorunlarına neden olabilir.


0
2018-06-16 13:33