2013-10-17 4 views
0

Gunicorn behinx 및 Ubuntu 12.04의 nginx 프록시.특정 HTML 문자열을 보내고있는 경우 gunicorn이 오류를 발생하지 않습니다.

나는 HTML 문자열을 보내는 베어 뼈 gunicorn 서버에서 다음과 같은 기능을 가지고 : 나는 send_html(start_response, 'Hello world')을 실행하면 그냥 잘 작동

def send_html(start_response, replystr): 
    try: 
     status = '200 OK' 
     response_headers = [('Content-type', 'text/html; charset=UTF-8'), 
          ('Content-Length', str(len(replystr)))] 
     start_response(status, response_headers) 
     return iter([replystr]) 
    except: 
     log.info(traceback.print_exc()) 
     send_error(start_response, '501') 
     return [] 

.

def _write_with_headers(self, data): 
     towrite = bytearray() 
     self.headers_sent = True 
     self.finalize_headers() 

     towrite.extend('%s %s\r\n' % (self.request_version, self.status)) 
     for header in self.response_headers: 
      towrite.extend('%s: %s\r\n' % header) 

     towrite.extend('\r\n') 
     if data: 
      if self.response_use_chunked: 
       ## Write the chunked encoding 
       towrite.extend("%x\r\n%s\r\n" % (len(data), data)) 
      else: 
       towrite.extend(data) 
     self._sendall(towrite) 
다음 gevent pywsgi 소스 코드 나 towrite을 알려줍니다

Traceback (most recent call last): 
    File "build/bdist.linux-x86_64/egg/gevent/pywsgi.py", line 504, in handle_one_response 
    self.run_application() 
    File "build/bdist.linux-x86_64/egg/gevent/pywsgi.py", line 491, in run_application 
    self.process_result() 
    File "build/bdist.linux-x86_64/egg/gevent/pywsgi.py", line 482, in process_result 
    self.write(data) 
    File "build/bdist.linux-x86_64/egg/gevent/pywsgi.py", line 375, in write 
    self._write_with_headers(data) 
    File "build/bdist.linux-x86_64/egg/gevent/pywsgi.py", line 394, in _write_with_headers 
    towrite.extend(data) 
TypeError: an integer or string of size 1 is required 

바이트 배열입니다 : 내가 뉴스 기사의 내용을 포함하는 상당한 문자열을 보내려고 할 때 그러나, 나는 다음과 같은 오류마다 시간을 얻을 것으로 보인다

기사 콘텐츠가 바이트 배열 등으로 멋지지 않습니까?

+1

내 첫 번째 추측은 replystr이 제대로 인코딩되지 않았다는 것입니다. 오류를 유발하는 문자열을 표시 할 수 있습니까? 문제를 일으키는 작은 문자열로 문자열의 범위를 좁히십시오. –

+0

그게 내가 끝내 준거야. 나는 정확하게 그 문자열이 오류를 일으킨 것을 기억하지 못한다. 그러나 나의 대답에서 볼 수 있듯이, 그것을 utf-8 bytearray로 인코딩하여 나의 특정한 문제를 해결했다. – Hersheezy

답변

0

답안을 보내기 전에 replystr을 바이트 배열로 바꾸어 send_html 함수를 수정했습니다. 이 솔루션이 얼마나 지속 가능한지 확실하지 않지만 잠시 동안 작업 해 왔습니다.

def send_html(start_response, replystr): 
    try: 
     status = '200 OK' 
     #coerce the string to a bytearray 
     replystr = bytearray(replystr, 'UTF-8') 
     response_headers = [('Content-type', 'text/html; charset=UTF-8'), 
          ('Content-Length', str(len(replystr)))] 
     start_response(status, response_headers) 
     return iter([replystr]) 
    except: 
     log.info(traceback.print_exc()) 
     send_error(start_response, '501') 
     return [] 
0

towrite.extend (STR ("%의 X \ 연구 \ n % S \ R \ n"% (LEN (데이터)의 데이터))) 를 수행하는 문제를 해결하는 것이다.

'연장 중'인 이유는 유니 코드를 허용하지 않습니다.