2010-07-20 13 views
24

मेरे django ऐप के भीतर मैं डीबी में एचटीएमएल के तारों को संग्रहीत कर रहा हूं जो तब उपयोगकर्ताओं के होम पेजों पर "संदेश" के रूप में प्रदर्शित किए जाएंगे। इनमें से कुछ संदेशों में फॉर्म हैं, लेकिन टेम्पलेट भाषा में नहीं लिखा जा रहा है, मैं csrf टोकन डालने में सक्षम नहीं हूं (इस प्रकार ऐप तोड़ रहा है)।मैं django csrf टोकन सीधे HTML में कैसे एम्बेड कर सकता हूं?

क्या इस टोकन को सीधे उस पायथन फ़ाइलों के अंदर से सम्मिलित करने का कोई तरीका है जिसे मैं संपादित कर रहा हूं? मैं कुछ के लिए कुछ ढूंढ रहा हूं:

csrf_token = django.csrf.generate() 
message = "press the button please: <form><input type='hidden' name='csrf_token' value='%s'><input type='submit' value='press here'></form>" % (csrf_token) 

कोई अन्य समाधान जो एक समान परिदृश्य में काम करेगा, वह बहुत अच्छा होगा। धन्यवाद

संपादित करें: वास्तव में है कि, काम करने के लिए क्योंकि टोकन प्रत्येक सत्र के लिए अलग है नहीं हो रहा है तो डाटाबेस में भंडारण बहुत उपयोगी नहीं है। दृश्य में टोकन गतिशील रूप से लोड करने का कोई तरीका है?

+0

आप 'गतिशील दृश्य के भीतर टोकन लोड' से क्या मतलब है? –

+0

फ़ॉर्म को डेटाबेस में एक स्ट्रिंग के रूप में संग्रहीत किया जाता है, इसलिए यदि मैं टोकन स्टोर करता हूं तो यह एक नए सत्र में लोड होने पर अमान्य हो जाएगा। यदि दृश्य के अंदर से एक नया टोकन लोड करना संभव था, तो मैं HTML को अवरुद्ध कर सकता था क्योंकि इसे प्रस्तुत किया जा रहा था, उपयुक्त टोकन डालें और कार्य फ़ॉर्म प्रदर्शित करें। यहां महत्वपूर्ण बात यह है कि मैं टोकन डालने के लिए टेम्पलेट के माध्यम से नहीं जा रहा हूं। क्या इससे स्पष्ट हो जाता है? – ergelo

+0

क्या आप सिर्फ csrf_protect सजावट का उपयोग नहीं कर सकते? – sureshvv

उत्तर

42

सीएसआरएफ टोकन प्राप्त करने के लिए django.middleware.csrf.get_token(request) पर कॉल करें।

+1

जो इसे हल कर लेगा। इस पर ध्यान दिलाने के लिए धन्यवाद! – ergelo

+0

क्या यह टोकन को एक छिपे हुए इनपुट में डालकर काम करता है? क्योंकि मैं एक ही त्रुटि प्राप्त करता रहता हूं, इस टोकन को फ़ॉर्म में रखने का सबसे अच्छा तरीका क्या होगा? –

+0

मेरे लिए ठीक समाधान "csrf_token" –

17

इसका उपयोग करने का तरीका, है सीधे इसे टेम्पलेट्स में उपयोग करने के लिए।

the documentation से,:

<form action="" method="post"> 
{% csrf_token %} 

आप सभी शामिल करने की आवश्यकता है।

+0

धन्यवाद। समस्या यह है कि 'संदेश' एक दृश्य में बनाया गया है, और बिना किसी दृश्य के डीबी में संग्रहीत किया जाता है। मैं फॉर्म बटन को एक लिंक में बदलकर और csrf को बाईपास करने के लिए दृश्य के माध्यम से समस्या का समाधान करूंगा। – ergelo

+8

सवाल उस मामले के लिए है जहां आप django के टेम्पलेट्स का उपयोग नहीं करते –

+0

यह Django-CMS की स्थापना के दौरान मेरे लिए हल हो गया! किसी कारण से यह मेरे पास एकमात्र टेम्पलेट में इस टोकन के बिना लॉगिन नहीं करेगा। अजीब। – MadPhysicist

10

स्वीकृत उत्तर मानता है कि टोकन पहले ही अनुरोध ऑब्जेक्ट में सेट है।

हो सकता है कि कुछ इस तरह बेहतर है:

from django.middleware import csrf 
def get_or_create_csrf_token(request): 
    token = request.META.get('CSRF_COOKIE', None) 
    if token is None: 
     token = csrf._get_new_csrf_key() 
     request.META['CSRF_COOKIE'] = token 
    request.META['CSRF_COOKIE_USED'] = True 
    return token 
+0

धन्यवाद के बजाय "csrfmiddlewaretoken" नाम का उपयोग करना था। यह मेरे लिए काम करता है। – wildcolor

+0

आपको आंतरिक एपीआई का उपयोग नहीं करना चाहिए और वास्तव में _get_new_csrf_key() Django में अब मौजूद नहीं है। आपको get_token() का उपयोग करना चाहिए। – interDist

संबंधित मुद्दे