2013-11-21 12 views
6

मैं अजगर के लिए नया हूँ। Django के लिए भी नया। मैं एक AJAX अनुरोध करने की कोशिश कर रहा हूं और here निर्देशों का पालन करता हूं। सबसे पहले, सीएसआरएफ कुकी को पुनर्प्राप्त करने का नतीजा हमेशा शून्य था, इसलिए मुझे sure_csrf_cookie नामक एक सजावटी विधि मिली। समस्या यह है कि यह एक दृश्य के लिए पूछता है, और मुझे नहीं पता कि किस पास पास करना है और जहां मैं इसका संदर्भ प्राप्त कर सकता हूं। कोड काफी सरल है:मैं sure_csrf_cookie का उपयोग कैसे करूं?

from django.shortcuts import render_to_response 
from django.core.context_processors import csrf 
from django.views.decorators.csrf import ensure_csrf_cookie 

def csv_to_xform(csv, template): 
    return render_to_response(template, { "data": "it works!" }) 

क्या मुझे कक्षा आधारित दृश्य का उपयोग करने की आवश्यकता है? यदि हां, तो क्या कुकी सेट करने का कोई बेहतर तरीका है? मैं here वर्णित विधि का उपयोग नहीं करना चाहता, क्योंकि मैं मान को मैन्युअल रूप से प्रबंधित नहीं करना चाहता हूं।

कोड के बाकी इस प्रकार है:

sandbox.html:

<!doctype html> 

<html> 
    <head> 
     <title>Sandbox</title> 

     <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script> 
     <script src="/static/js/csrf.js"></script> 

     <script type="text/javascript"> 
      $(function() { 
       $('#send-csv-btn').click(function() { 
        $.post('/csv', { 
         data: '1, 2, 3', 
         success: function (response) { 
          console.debug(response); 
         }, 
         error: function (response) { 
          console.debug(response); 
         } 
        }); 
       }); 
      }); 
     </script> 
    </head> 

    <body> 
     <form> 
      {% csrf_token %} 
      <input type="button" id="send-csv-btn" /> 
     </form> 
    </body> 
</html> 

urls.py:

urlpatterns = patterns('', 
    url(r'^$', 'dkobo.formbuilder.views.main', name='fb'), 
    url(r'^admin/', include(admin.site.urls)), 
    url(r'^csv$', 'dkobo.formbuilder.views.csv_to_xform', { "template": "sandbox-stub.html" }), 
    url(r'^sandbox$', 'dkobo.formbuilder.views.sandbox') 
) 

settings.py:

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
) 

उत्तर

11

कुकीज सर्वर प्रतिक्रिया पर सेट करता है, इसलिए आपको देखने के लिए @ensure_csrf_cookie सजावटी सेट अप करने की आवश्यकता है, जो पृष्ठ प्रस्तुत करता है, जिससे उपयोगकर्ता AJAX-अनुरोध करेगा।

उदाहरण के लिए, यदि उपयोगकर्ता ब्राउज़र साइट मुख्य पृष्ठ पर AJAX- अनुरोध करते हैं, तो इस सजावटी को मुख्य पृष्ठ के लिए जिम्मेदार देखने के लिए सेट करें।

अद्यतन: AJAX अनुरोध सैंडबॉक्स पृष्ठ से कॉल करता है? तो सैंडबॉक्स देखने के लिए ensure_csrf_cookie स्थापित करने के लिए, इस तरह का प्रयास करें:

@ensure_csrf_cookie 
def sandbox(request): 
... 
+0

मैंने बाकी कोड अपलोड किया ... क्या आप एक उदाहरण दे सकते हैं? –

+0

मैंने उत्तर – Nikita

+0

उत्तर दिया, यह काम किया! धन्यवाद। –

3

सीएसआरएफ टोकन स्वचालित रूप से पहचाने जाते हैं n आप:

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

अपनी परियोजना settings.py फ़ाइल में।

आप इस तरह के मध्यस्थ है, तो आप केवल अपने सभी रूपों (टेम्पलेट्स में) करने के लिए crsf_token चर डाल करने के लिए उदाहरण के लिए की जरूरत है, और यह अपने आप मान्य है,:

<form> 
{% csrf_token %} 
... 

मैं अगर मैं समझ नहीं जानता कि अपने समस्या बिल्कुल;)

+0

मैं क्या समझ में आ के अनुसार, '{% csrf_token%}' तत्व एक फार्म के अंदर की जरूरत है। मेरे पास मेरे टेम्पलेट पर कोई फॉर्म नहीं हो सकता है (इस मामले में मैं करता हूं, लेकिन यह सैंडबॉक्स है)। मैं मूल रूप से एक फॉर्म तत्व के बिना कुकी सेट करने में सक्षम होना चाहता हूं –

+0

मैंने जो कहा है, मैंने कोशिश की, और यह काम नहीं किया। '{% csrf_token%} 'कुछ भी नहीं देता है। मैं बाकी प्रासंगिक कोड को शामिल करने के लिए पोस्ट अपडेट कर रहा हूं। –

3

यद्यपि आप पाया है आप इन अवधारणाओं क्या देख रहे थे आप में मदद मिलेगी।

विचार ऐसे कार्य हैं जिन्हें यूआरएल से अनुरोध किया जाता है।

  1. समारोह आधारित विचारों
  2. कक्षा आधारित विचार: और वहाँ विचारों के दो प्रकार हैं।

दृश्य का मूल कार्य एक HttpRequest को संसाधित करना और एक HttpResponse भेजना है। और प्रत्येक दृश्य जो HttpResponse को वापस कर रहा है, में एक अनुरोध पैरामीटर होना चाहिए।

एक समारोह आधारित देखने का उदाहरण:

def myView(request): 
    ... 
    # process the request here 
    return HttpResponse() # or render_to_response depending upon what you want. 

मैं अपने दृश्य में एक request पैरामीटर को देखने नहीं है।

अब एक सजावटी ऐसा कुछ है जो कुछ स्थितियों को एक दृश्य पर रखता है।

उदाहरण के लिए: यदि आपके पास टिप्पणी करने के लिए फ़ंक्शन दिखाई देता है और आप उपयोगकर्ता को टिप्पणी करने के लिए लॉग इन करना चाहते हैं, तो आप दृश्य पर login_required सजावटी का उपयोग कर सकते हैं।

यह सुनिश्चित करेगा कि जो भी टिप्पणी करना चाहता है उसे पहले लॉगिन करने की आवश्यकता होगी। बुनियादी वाक्य रचना है:

@login_required # this is the decorator 
def comment(request): # this is the view on which the decorator is acting upon 
... 
... 
return HttpResponse() 

@login_required के समान, @ensure_csrf_cookie एक डेकोरेटर है।

+0

आह अब मुझे मिल गया है! मैं विचारों के बारे में हिस्सा जानता था और बस पाया कि पहला तर्क पास ऑब्जेक्ट है। मुझे नहीं पता था कि सजावटी सामान्य कार्यों से अलग थे। इसे साफ करने के लिए धन्यवाद! –

+0

मेरी खुशी .... –

+0

मैं इसे कक्षा-आधारित दृश्य पर कहां रखूं? जैसे डीआरएफ का 'हाइपरलिंक्डमोडेल व्यूसेट'? – Jayen

9

वर्ग आधारित दृश्य के साथ यह करने के लिए एक रास्ता तलाश उन लोगों के लिए:

from django.utils.decorators import method_decorator 
from django.views.decorators.csrf import ensure_csrf_cookie 

class MyView(View): 

    @method_decorator(ensure_csrf_cookie) 
    def get(self, request, *args, **kwargs): 
     ... 
संबंधित मुद्दे