2014-01-23 2 views
2

내가 몇 가지 기본적인 WSGI 물건을하고있어 시간 초과 핸들 :WSGI 클라이언트는

이 수시로 발생
def application(environ, start_response): 
    start_response("200", []) 
    result = some_long_func() 
    return [result] 

그 클라이언트의 연결이 끊어 some_long_func 완료되기 전에 내가 내 로그에 다음 참조 :

SIGPIPE: writing to a closed pipe/socket/fd (probably the client disconnected)... 

응용 프로그램 수준에서 연결이 끊어진 클라이언트를 처리 할 수있는 방법이 있습니까? 예 : application()이 반환되기 전에?

내 서버는 uwsgi (독립형)입니다. 프레임 워크가 없으며 단지 순수한 파이썬입니다.

+0

실마리가 없습니다. 그러나 나는 알고 싶을 것이다. –

+0

연결이 끊긴 클라이언트를 "처리하는"의미를 분명히해야합니다. 이를 무시하고 싶다면 uWSGI 옵션으로 할 수 있습니다. WSGI close() 메소드 만 사용하면 요청이 끝날 때 항상 코드를 실행해야합니다. – roberto

+0

@roberto : 연결 해제시 응용 프로그램 별 작업을 수행하고 싶습니다. DB에 오류를 기록하고 그 오류에 관한 메일을 보내십시오. – georg

답변

1

응용 프로그램에 의해 반환 된 반복자가 close() 메소드가있는 경우, 서버 나 게이트웨이 여부, 현재 요청이 완료되면이 메서드를 호출해야합니다 요청이 정상적으로 완료되었거나 오류로 인해 일찍 종료되었습니다.

따라서 출력 반복기가 완료되기 전에 close()이 호출되면 클라이언트 연결이 끊어졌습니다.

+0

감사합니다. 이는 실행 가능한 솔루션처럼 보입니다. – georg

1

아니요. WSGI 사양의 범위 내에서이 문제를 처리 할 방법이 없습니다. mod_wsgi 메일 링리스트에서 검색 토론을하십시오. 하나는 이러한 논의는 다음과 같습니다

+0

혼란 스럽습니다. 자신의 회신을 인용하려면 다음과 같이하십시오. "연결 종료가 감지되면 Python 예외가 응용 프로그램에 표시되며 수행 할 작업에 달려 있습니다."- 본질적으로 내가 찾고있는 것입니다. – georg

+0

write() 호출 가능 코드 (어쨌든 사용해서는 안 됨)를 사용하지 않고 코드의 작성 방법으로 문자열을 볼 수없고 처리 할 수 ​​있으므로 대신 문자열의 반복 가능 문자로 리턴합니다. 따라서 단절에 대한 예외를 보는 WSGI 서버 일 뿐이며 일반적으로 무언가를 기록하는 이유입니다. write() 콜백을 사용하는 것이 좋지 않다는 것을 감안할 때 단절이 발생할 때 wsgi.input에서 읽지 못하도록 막는 경우에만 코드에서 예외가 표시됩니다. –

+0

알겠습니다. 내가 생각한 것은'try : write ("") except ...를 호출하는 것입니다. 클라이언트에게 ping을하는 것만으로 되돌아 오기 전에 그냥 예외를 기록하고 아무것도 반환하지 않습니다. 그렇지 않으면 일반적인 반복 가능을 반환합니다. 그게 바보 같은 생각인가요? – georg