2012-08-03 21 views
9

Bir Django web uygulaması üzerinde çalışıyorum (diğer şeyler arasında), bir POST isteği kullanılarak gönderilen işlem durumu bilgisini işlemek için.Django testinde HTTP_REFERER başlığını ayarlama

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

Şimdi sınamak için nasıl çalışmak istiyorum: settings.py bir giriş karşı

ödeme ağ geçidi tarafından desteklenen HTTP güvenliğine ek olarak

, benim bakış çekleri request.META['HTTP_REFERER'] komik iş önlemek için denemek için Bu davranış

Yeterli bir hata yapabilirim;

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

Nasıl olsa da, can sahte başarılı bir gönderme: HTTP_REFERER (tahmin) normal sayfa yüküyle None mı? HTTP_REFERER'u extra, adresinden ayarlamayı denedim.self.client.post(..., extra={'HTTP_REFERER': 'http://foo/bar'}), fakat bu çalışmıyor; görünüşte görünüşe göre hala boş bir başlık görüyor.

Test istemcisi özel üstbilgileri bile destekliyor mu? Yoksa bir iş var mı? Django 1.1 kullanıyorum ve henüz mümkün değilse henüz yükseltmemeyi tercih ederim. Neredeyse haklı olarak

+0

Bu sizin sorununuz değildi, ancak zorlukla karşılaştığım başkaları için: Django, gönderdiğim başlıkları tanımıyordu çünkü isimlerini belgelendirilmiş olarak doğru şekilde dönüştürmedim (https: // docs. [CGI belirtimini] açıkladığı gibi (http://tools.ietf.org/html/draft-robinson- www-arayüz-00 # sayfa-8). Örneğin, 'X-CSRFToken'' HTTP_X_CSRFTOKEN' olacaktır. Onları değiştirdikten sonra, onları denetçinin aşağıdaki cevabındaki gibi kwargs olarak kullanabilirim. –

cevap

14

. Aslında var:

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

Ben ** kaçırmıştı (açma dağılım operatörü/anahtar kelime argüman operatör/whatever) ne zaman reading the source of test/client.py; extra, fonksiyonun kendisine ekstra anahtar kelime argümanları sözlüğü haline gelir.

+0

Bir "__init __(), bunu kullanmaya çalışırken" HTTP_REFERER "beklenmedik bir anahtar kelime argümanına sahip oldum. Belki de django'nun yeni sürümlerinde değişti? –

+0

@StevenRogers, 'c = İstemci (HTTP_REFERER =' http: // foo/bar ') 'yerine getirmişsiniz gibi geliyor (bunun yerine düşünebildiğim tek şey,' __init__' olarak adlandırılacaktır). Bunu 'post() '&' get() 'için bir kwarg olarak eklemeyi öneriyordum; Bunu Django 1.7.3 üzerinde test ettim ve iyi çalışıyor gibi görünüyor… – supervacuo

0

Sen Client kurucusuna HTTP başlıklarını geçirebilirsiniz:

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')) 

Eğer başlıklarını bir talepte her zaman geçirmek gerekmez Bu şekilde.

İlgili konular