2012-08-03 13 views
9

में HTTP_REFERER शीर्षलेख सेट करना मैं एक Django वेब एप्लिकेशन पर काम कर रहा हूं (अन्य चीजों के साथ) POST अनुरोध का उपयोग करके भेजे गए लेनदेन स्थिति की जानकारी को संभालने की आवश्यकता है।Django परीक्षण

if request.META.get('HTTP_REFERER', '') != settings.PAYMENT_URL and not settings.DEBUG: 
    return HttpResponseForbidden('Incorrect source URL for updating payment status') 

अब मैं बाहर काम करने के लिए कैसे परीक्षण करना चाहते हैं:

भुगतान गेटवे द्वारा समर्थित HTTP सुरक्षा के अलावा, मेरे विचार चेकों request.META['HTTP_REFERER']settings.py में एक प्रविष्टि के खिलाफ अजीब व्यापार को रोकने के लिए प्रयास करने के लिए यह व्यवहार

मैं आसानी से विफलता उत्पन्न कर सकता हूं;

def test_transaction_status_succeeds(self): 
    response = self.client.post(reverse('transaction_status'), { ... }) 
    self.assertEqual(response.status_code, 403) 

कैसे, हालांकि, मैं नकली एक सफल प्रस्तुत कर सकते हैं: HTTP_REFERER (जाहिर) एक सामान्य पेज लोड के साथ None है? मैंने extra, में HTTP_REFERER सेट करने का प्रयास किया है।self.client.post(..., extra={'HTTP_REFERER': 'http://foo/bar'}), लेकिन यह काम नहीं कर रहा है; दृश्य स्पष्ट रूप से अभी भी एक खाली शीर्षलेख देख रहा है।

क्या परीक्षण क्लाइंट कस्टम हेडर का भी समर्थन करता है? क्या कोई काम नहीं है अगर नहीं? मैं Django 1.1 का उपयोग कर रहा हूं, और अगर संभव हो तो अभी तक अपग्रेड नहीं करना पसंद करूंगा।

+0

यह आपकी समस्या नहीं थी, लेकिन जिन लोगों को मेरी कठिनाई हो रही थी, उनके लिए: Django उन शीर्षकों को पहचान नहीं रहा था जिन्हें मैं भेज रहा था क्योंकि मैंने उनके नामों को दस्तावेज के रूप में सही ढंग से परिवर्तित नहीं किया था [https] // https: // docs। djangoproject.com/en/1.6/topics/testing/tools/#django.test.client.Client.get), जैसा कि [सीजीआई विनिर्देश का वर्णन किया गया है] (http://tools.ietf.org/html/draft-robinson- www इंटरफ़ेस-00 # पेज -8)। उदाहरण के लिए, 'एक्स-सीएसआरएफटीओएन' 'HTTP_X_CSRFTOKEN' होगा। उन्हें बदलने के बाद मैं उन्हें आसानी से kwargs के रूप में उपयोग कर सकता हूं, जैसा कि नीचे पर्यवेचु के उत्तर में है। –

उत्तर

14

लगभग सही। यह वास्तव में है:

def transaction_status_suceeds(self): 
    response = self.client.post(reverse('transaction_status'), {}, HTTP_REFERER='http://foo/bar') 

मैं एक ** याद किया था (खोल बिखराव ऑपरेटर/कीवर्ड तर्क ऑपरेटर/whatever) जब reading the source of test/client.py; extra फ़ंक्शन के लिए अतिरिक्त कीवर्ड तर्कों का एक शब्दकोश होने का अंत होता है।

+0

मुझे इसका उपयोग करने का प्रयास करते समय "__init __() को एक अप्रत्याशित कीवर्ड तर्क 'HTTP_REFERER' मिला है। शायद यह django के नए संस्करणों में बदल गया? –

+0

@StevenRogers, ऐसा लगता है जैसे आपने 'सी = क्लाइंट (HTTP_REFERER = 'http: // foo/bar') किया होगा (इसके बजाय केवल एक चीज जिसे मैं सोच सकता हूं '__init__'' कहलाएगा)। मैं यह सुझाव दे रहा था कि एक क्वार के रूप में 'पोस्ट() 'और' प्राप्त करें() '; मैंने अभी Django 1.7.3 पर इसका परीक्षण किया और ऐसा लगता है कि यह ठीक काम करता है ... – supervacuo

0

आप Client के निर्माता के लिए HTTP हेडर पारित कर सकते हैं:

from django.test import Client 
from django.urls import reverse 

client = Client(
    HTTP_USER_AGENT='Mozilla/5.0', 
    HTTP_REFERER='http://www.google.com', 
) 
response1 = client.get(reverse('foo')) 
response2 = client.get(reverse('bar')) 

इस तरह आप हेडर हर बार जब आप एक अनुरोध बनाने के पारित करने के लिए की जरूरत नहीं है।