it-swarm.asia

جانغو CSRF كوكي لم يتم تعيين

لدي بعض المشاكل لبعض الوقت الآن ، فأنا أعاني من عدم تعيين ملف تعريف ارتباط CSRF. يرجى إلقاء نظرة على الرموز أدناه

الثعبان

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 هنا هو الرمز

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>

أنا عالقة ، قمت بالفعل بمسح ملف تعريف الارتباط ، واستخدمت متصفحًا آخر ولكن لا يزال ملف csrf لم يتم تعيينه.

62
user2389182

يمكن أن يحدث هذا أيضًا إذا تم تعيين CSRF_COOKIE_SECURE = True وكنت تدخل إلى الموقع بشكل غير آمن.

100
Druska
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")
44
Евгений Смирнов

إذا كنت تستخدم HTML5 Fetch API لجعل POST طلبات كمستخدم مسجل الدخول والحصول على Forbidden (CSRF cookie not set.) ، فقد يكون ذلك بسبب الافتراضي fetch لا يتضمن ملفات تعريف الارتباط للجلسة ، مما يؤدي إلى تفكير Django فيك مستخدم مختلف عن المستخدم الذي قام بتحميل الصفحة.

يمكنك تضمين الرمز المميز للجلسة بتمرير الخيار credentials: 'include' لجلب:

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

من هذا يمكنك حلها عن طريق إضافة confirm_csrf_cookie decorator إلى وجهة نظرك

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

إذا لم تنجح هذه الطريقة. ستحاول التعليق csrf في الوسيطة. واختبار مرة أخرى.

7
dscanon

صادفت موقفًا مشابهًا أثناء العمل مع DRF ، كان الحل هو إلحاق طريقة .as_view () بالعرض في urls.py

2
Pratik Mhatre

نشأت هذه المشكلة مرة أخرى في الآونة الأخيرة بسبب وجود خطأ في بيثون نفسها.

http://bugs.python.org/issue22931

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

بين الإصدارات المتضررة كانت 2.7.8 و 2.7.9. لم يتم قراءة ملف تعريف الارتباط بشكل صحيح إذا كانت إحدى القيم تحتوي على حرف [.

يؤدي تحديث Python (2.7.10) إلى حل المشكلة.

1
sbaechler

كنت أستخدم Django 1.10 before.So كنت أواجه هذه المشكلة. الآن قمت بتخفيضه إلى الإصدار 1.9 من Django وهو يعمل بشكل جيد.

1
indspecter

يحدث هذا أيضًا عند عدم تعيين إجراء النموذج.
بالنسبة لي ، كان يظهر هذا الخطأ عندما كان الرمز:

<form class="navbar-form form-inline my-2 my-lg-0" role="search" method="post">

عندما قمت بتصحيح الكود الخاص بي في هذا:

<form class="navbar-form form-inline my-2 my-lg-0" action="{% url 'someurl' %}" role="search" method="post">

خطأي اختفى.

1
Gokul Yesudoss

تأكد من تكوين الواجهة الخلفية لجلسة Django بشكل صحيح في settings.py. ثم جرب هذا ،

class CustomMiddleware(object):
  def process_request(self,request:HttpRequest):
      get_token(request)

أضف هذه الوسيطة في settings.py ضمن MIDDLEWARE_CLASSES أو MIDDLEWARE اعتمادًا على إصدار Django

get_token - إرجاع رمز CSRF المطلوب لنموذج POST. الرمز المميز هو قيمة أبجدية رقمية. يتم إنشاء رمز مميز جديد إذا لم يتم تعيين أحد بالفعل.

0
arp

طريقة 1:

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

الطريقة 2:

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

لأن render_to_response طريقة قد حالة بعض مشكلة ملفات تعريف الارتباط الاستجابة.

0
shenqi0920

يبدو أن المشكلة لا تقوم بمعالجة GET بشكل مناسب أو مباشر نشر البيانات دون الحصول على النموذج أولاً.

عند الوصول إلى الصفحة لأول مرة ، سيرسل العميل طلب GET ، في هذه الحالة ، يجب أن ترسل html مع النموذج المناسب.

في وقت لاحق ، يملأ المستخدم النموذج ويرسل طلب POST مع بيانات النموذج.

يجب أن تكون وجهة نظرك:

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
Rohan

حاول التحقق مما إذا كانت قد قمت بتثبيت في الإعدادات

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

في القالب ، يتم تنسيق البيانات باستخدام csrf_token:

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

كان لدي نفس الخطأ ، في حالتي ، تساعد إضافة method_decorator على:

from Django.views.decorators.csrf import csrf_protect
from Django.utils.decorators import method_decorator

method_decorator(csrf_protect)
def post(self, request):
    ...
0
moszoro

تحقق من تعيين ملفات تعريف ارتباط chrome مع الخيار الافتراضي لمواقع الويب. السماح بتخزين البيانات المحلية لتعيين (موصى به).

0
IWS