2012-02-12 16 views
7

मेरी views.py मुद्रण नहीं csrf_tokenDjango छिपी हुई इनपुट फ़ील्ड

<html> 
<body> 
<h1> All uploaded posters: </h1> 
<form action='/posters/upload' method= 'POST'>{%csrf_token%} 
<input type='file' name= 'uploadfile'>Upload new poster <input type="submit" value = "Upload"> 
</form> 
{%for file in files %} 
<a href = 'http://servername/~username/posters/{{file}}'>{{file}}</a> <br /> 
{%endfor%} 
</body> 
</html> 
तो

जब मैं ब्राउज़र में मुखपृष्ठ खोलना और स्रोत कोड देख सकते हैं और वहाँ कोई CSRF टोकन है !

<html> 
<body> 
<h1> All uploaded posters: </h1> 
<form action='/posters/upload' method= 'POST'> 
<input type='file' name= 'uploadfile'>Upload new poster <input type="submit" value = "Upload"> 
</form> 

<a href= ...... 

मुझे क्या याद आया?

अद्यतन: this में मदद की।

उत्तर

8

आप क्रम में RequestContext उपयोग करने के लिए CSRF मिडलवेयर उपयोग करने की आवश्यकता:

from django.template import RequestContext 

# In your view: 
return render_to_response('index.html' 
    {'files':os.listdir('/home/username/public_html/posters') }, 
    context_instance=RequestContext(request)) 

Btw: csrf_protect डेकोरेटर का प्रयोग करें, अनुशंसित नहीं है क्योंकि आप इसे उपयोग करने के लिए भूल जाते हैं, तो आप एक सुरक्षा छेद करना होगा।

from django.shortcuts import render 

def some_view(request): 
    return render(request, 'template.html', context_dict) 
+0

धन्यवाद, यह मुझे पागल कर रहा था। खुशी है कि यह कुछ आसान था। – Cerin

1

एक बार जब आप 1.3 पर हैं (जो आप होना चाहिए), render शॉर्टकट यह करने का एक अधिक कॉम्पैक्ट तरीका प्रदान करता है।

सजावटी विधि एक कंबल सुरक्षा के रूप में CsrfViewMiddleware जोड़ने की बजाय, आप csrf_protect सजावट का उपयोग कर सकते हैं, जिसमें विशेष रूप से समान कार्यक्षमता है, जो सुरक्षा की आवश्यकता है। यह उन दोनों विचारों पर उपयोग किया जाना चाहिए जो आउटपुट में सीएसआरएफ टोकन डालें, और उन पर जो POST फॉर्म डेटा स्वीकार करते हैं। (ये अक्सर एक ही दृश्य समारोह होते हैं, लेकिन हमेशा नहीं)। यह इस तरह से प्रयोग किया जाता है:

डेकोरेटर की
from django.views.decorators.csrf import csrf_protect 
from django.template import RequestContext 

@csrf_protect 
def my_view(request): 
    c = {} 
    # ... 
    return render_to_response("a_template.html", c, 
           context_instance=RequestContext(request)) 

उपयोग, जो अपने आप द्वारा अनुशंसित नहीं है क्योंकि आप इसे उपयोग करने के लिए भूल जाते हैं, तो आप एक सुरक्षा छेद करना होगा। दोनों का उपयोग करने की 'बेल्ट और ब्रेसिज़' रणनीति ठीक है, और न्यूनतम ओवरहेड लगेगी।

0

कृपया Django दस्तावेज़ के स्निपेट देखें: