2012-08-03 2 views
9

POST 요청을 사용하여 전송 된 트랜잭션 상태 정보를 처리해야하는 장고 웹 응용 프로그램에서 작업하고 있습니다.Django 테스트에서 HTTP_REFERER 헤더 설정

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

지금 내가 테스트하는 방법을 해결하고 싶습니다 : settings.py의 항목에 대한

지불 게이트웨이에서 지원하는 HTTP 보안 외에도

, 내보기 검사 request.META['HTTP_REFERER'] 재미 사업을 방지하기 위해 시도 이 행동.

나는 쉽게 오류를 생성 할 수 있습니다.

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

방법,하지만, 수 나는 가짜 성공적인 제출 : HTTP_REFERER는 (예상) 일반 페이지로드와 None입니까? 나는 을 extra, 에 설정하려고 시도했습니다.self.client.post(..., extra={'HTTP_REFERER': 'http://foo/bar'}),하지만 이것은 작동하지 않습니다. 보기에는 여전히 빈 헤더가 표시됩니다.

테스트 클라이언트는 사용자 지정 헤더도 지원합니까? 문제가 해결되지 않았습니까? 나는 Django 1.1을 사용하고 있으며, 가능하다면 업그레이드하지 않는 것을 선호한다.

+0

이것은 문제가 아니지만 어려움을 겪고있는 다른 사람들을 위해 : Django는 내가 보낸 헤더를 인식하지 못했습니다. 문서의 이름을 제대로 변환하지 않았기 때문에 (https : // docs. djangoproject.com/en/1.6/topics/testing/tools/#django.test.client.Client.get), [CGI 규격에 설명 된] (http://tools.ietf.org/html/draft-robinson- www-interface-00 # page-8). 예를 들어'X-CSRFToken'은'HTTP_X_CSRFTOKEN'입니다. 그 (것)들을 변형 한 후에 나는 superwacuo의 응답에서 것과 같이 아래에 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'가 있습니다. 어쩌면 그것은 최신 버전의 장고로 변경 되었습니까? –

+0

@StevenRogers, 대신에'c = Client (HTTP_REFERER = 'http : // foo/bar')'를했을 것 같습니다. (생각할 수있는 유일한 방법은'__init__'를 호출하는 것입니다.) 나는 이것을'post()'와'get()'에 kwarg로 추가 할 것을 제안했다. 난 그냥 장고 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')) 

당신이 헤더 당신이 요청을 할 때마다 통과 할 필요가 없습니다 이쪽으로.

관련 문제