2017-03-04 6 views
0

로 볼 수 데이터를 전송하지 않습니다 해당 요청을 트리거 뷰 foo :장고 self.client.post 내가 유효한 데이터와 <code>POST</code> 요청이 200 상태 코드를 가진 HTML 응답을 반환 확인하는 간단한 테스트 케이스를 장식

: @enter_exit_tracer 함수를/입력 종료 추적하는 장식이

logger = logging.getLogger(__name__) 

# decorator to trace enter and exit events 
enter_exit_tracer = enter_exit_Tracer(logger) 

@enter_exit_tracer 
def foo(request): 
    if request.method == 'POST': 
     # 
     print('request.POST:', request.POST) 
     # 
     # some stuff 

이 장식자를 foo 함수에 추가하면 self.client.post을 통해 전송 된 POST 데이터는 실제로 foo으로 전달되지 않습니다. 그들은 테스트 요청에서 누락 - 나의 테스트가 실패 :

DEBUG: [] Enter foo. 
request.POST: <QueryDict: {}> 
ERROR: Invalid form 
F 
====================================================================== 
FAIL: test_valid_post_request (textstat.tests.PostRequestTestCase) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/home/user/Pro/myapp/tests.py", line 111, in test_valid_post_request 
    self.assertEqual(response.status_code, 200) 
AssertionError: 400 != 200 

---------------------------------------------------------------------- 
Ran 1 test in 0.018s 

FAILED (failures=1) 

우리는 request.POST: <QueryDict: {}>을보고 결국이 ERROR: Invalid form에 연결됩니다.

동시에 내가 비슷한 POST 요청을하지만 웹 브라우저를 통해 모든 것이 잘 작동합니다. 양식에 데이터가 채워지면 웹 페이지가 정상적으로 렌더링되고 @enter_exit_tracer은 예상대로 로깅을 수행합니다.

request.POST: <QueryDict: {'text': ['bar']}> 
. 
---------------------------------------------------------------------- 
Ran 1 test in 0.007s 

OK 

질문 : 다음 request.POST 데이터가 장식으로보기에 전달되지 않는 이유

  • 나는 그 모든도 OK 작동 테스트를 통과 @enter_exit_tracer 장식을 주석 경우 self.client.post 요청의 경우?

  • 데코레이터에 이상이있는 경우 - 웹 요청이 정상적으로 작동하는 이유는 무엇입니까?
  • 데코레이터를 유지하고 self.client.post을보기로 전달할 수 있습니까?
+0

로깅이 클라이언트와 함께 호출 되나요? –

+0

예, 로거는 뷰 데코레이터에서 초기화 될 때 클라이언트와 함께 호출됩니다. 예를 들어,'self.client.post'에는 출력 로그에'DEBUG : Enter foo.'가 있습니다. –

+0

실제로 질문에있는 코드는 데코레이터의 게시 된 코드에서 args [-1] else '[]''의 'session_key'가 있으면 'session_string = args [-1]'을 제거하여 지나치게 단순화했습니다. 코드의이 줄이 pb의 원인이 될 수 없다고 생각했습니다. 그리고 나는 틀렸어.이 줄은 돼지의 근원 이었어. 아래 내 대답에 대한 자세한 내용. –

답변

0

그것은 장식이 줄에 TypeError 오류가 밝혀 : args[-1]하지 str

session_string = args[-1] if 'session_key' in args[-1] else '[]' 

그래서 다음이 작동하지 않을 수 있습니다. str(args[-1])으로 해결하면 POST 데이터가 누락되어 전체 문제가 해결됩니다.

self.client.postTypeError을 모으지 않았고 session_string은 어떻게 든 계산되었지만 유선입니다. 대신 POST 데이터는 오류 또는 힌트 경고없이보기로 전송되지 않았습니다. POST 데이터가 사라졌습니다. 동시에 POST 요청이 웹 브라우저에서 전송되었을 때 같은 코드가 제대로 작동하므로 오류가 눈에 띄지 않았습니다.

관련 문제