Werkzeug: WerkzeugλŠ” λ‹«νžŒ νŒŒμ΄ν”„μ— μ“΄ ν›„ μΆ©λŒν•©λ‹ˆλ‹€.

에 λ§Œλ“  2016λ…„ 06μ›” 20일  Β·  41μ½”λ©˜νŠΈ  Β·  좜처: pallets/werkzeug

NGINX λ’€μ—μ„œ μ‹€ν–‰λ˜λŠ” Werkzeug μ„œλ²„κ°€ μžˆμŠ΅λ‹ˆλ‹€. Werkzeug μ„œλ²„κ°€ μ‘λ‹΅ν•˜κΈ°λ₯Ό κΈ°λ‹€λ¦¬λŠ” λ™μ•ˆ ν΄λΌμ΄μ–ΈνŠΈκ°€ 연결을 끊으면 NGINXλŠ” Werkzeug에 λŒ€ν•œ νŒŒμ΄ν”„λ₯Ό λ‹«μŠ΅λ‹ˆλ‹€. 파이썬 ν”„λ‘œκ·Έλž¨μ΄ Werkzeug에 λŒ€ν•œ 응닡을 μž‘μ„±ν•  λ•Œ λ‹€μŒ μ˜ˆμ™Έκ°€ λ°œμƒν•˜κ³  Werkzeugκ°€ μΆ©λŒν•©λ‹ˆλ‹€.

역좔적(κ°€μž₯ 졜근 호좜 λ§ˆμ§€λ§‰):
파일 "server.py", 81ν–‰,
app.run(호슀트=args.host, 포트=args.port, 디버그=False)
파일 "/usr/local/lib/python2.7/dist-packages/flask/app.py", 843ν–‰, μ‹€ν–‰ 쀑
run_simple(호슀트, 포트, 자체, **μ˜΅μ…˜)
run_simpleμ—μ„œ 파일 "/usr/local/lib/python2.7/dist-packages/werkzeug/serving.py", 694ν–‰
μ•ˆμ˜()
파일 "/usr/local/lib/python2.7/dist-packages/werkzeug/serving.py", 659ν–‰, λ‚΄λΆ€
srv.serve_forever()
"/usr/local/lib/python2.7/dist-packages/werkzeug/serving.py" 파일, 499ν–‰, serve_forever
HTTPServer.serve_forever(자체)
"/usr/lib/python2.7/SocketServer.py" 파일, 238ν–‰, serve_forever
self._handle_request_noblock()
파일 "/usr/lib/python2.7/SocketServer.py", 297ν–‰, _handle_request_noblock
self.handle_error(μš”μ²­, client_address)
파일 "/usr/lib/python2.7/SocketServer.py", 295ν–‰, _handle_request_noblock
self.process_request(μš”μ²­, ν΄λΌμ΄μ–ΈνŠΈ μ£Όμ†Œ)
process_request의 파일 "/usr/lib/python2.7/SocketServer.py", 321ν–‰
self.finish_request(μš”μ²­, client_address)
파일 "/usr/lib/python2.7/SocketServer.py", 334ν–‰, finish_request
self.RequestHandlerClass(μš”μ²­, ν΄λΌμ΄μ–ΈνŠΈ μ£Όμ†Œ, 자기)
파일 "/usr/lib/python2.7/SocketServer.py", 651ν–‰, μ΄ˆκΈ°ν™”
self.finish()
파일 "/usr/lib/python2.7/SocketServer.py", 710ν–‰, μ™„λ£Œ
self.wfile.close()
파일 "/usr/lib/python2.7/socket.py", 279ν–‰, λ‹«κΈ°
self.flush()
파일 "/usr/lib/python2.7/socket.py", 303ν–‰, ν”ŒλŸ¬μ‹œ
self._sock.sendall(보기[write_offset:write_offset+buffer_size])
socket.error: [Errno 32] 깨진 νŒŒμ΄ν”„

μΆ©λŒμ„ λ°©μ§€ν•˜κΈ° μœ„ν•΄ λˆ„λ½λœ 일뢀 ꡬ성 μ˜΅μ…˜μ΄ μžˆμŠ΅λ‹ˆκΉŒ? 일반적으둜 λͺ¨λ“  μ˜ˆμ™Έκ°€ catch되고 500 였λ₯˜κ°€ λ°˜ν™˜λ˜λ©° μ„œλ²„λŠ” ν™œμ„± μƒνƒœλ‘œ μœ μ§€λ©λ‹ˆλ‹€.

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

졜근 μˆ˜μ • 컀밋에 따라 passthrough_errors=False둜 app.run을 ν˜ΈμΆœν•˜μ—¬ 이 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. YMMV

λͺ¨λ“  41 λŒ“κΈ€

Werkzeug 개발 μ„œλ²„κ°€ μ•„λ‹Œ Gunicorn λ˜λŠ” uWSGI와 같은 ν”„λ‘œλ•μ…˜ WSGI μ„œλ²„λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

λ‚˜λŠ” Werkzeug dev μ„œλ²„λ₯Ό 개발(즉, AFAICT, μ˜λ„λœ μš©λ„), 즉 포트 5000에 직접 μ—°κ²°λœ λΈŒλΌμš°μ €λ₯Ό μ‚¬μš©ν•˜κ³  μžˆλ‹€λŠ” 점을 μ œμ™Έν•˜κ³ λŠ” 맀우 μœ μ‚¬ν•œ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

였λ₯˜λŠ” μ‹œκ°„λ‹Ή μ—¬λŸ¬ 번 λ°œμƒν•˜μ—¬ 계속 κ°œλ°œν•˜λ €λ©΄ μ„œλ²„λ₯Ό μˆ˜λ™μœΌλ‘œ λ‹€μ‹œ μ‹œμž‘ν•΄μ•Ό ν•©λ‹ˆλ‹€.

λ‹€μŒμ€ μ—­μΆ”μ μž…λ‹ˆλ‹€.

Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 801, in __bootstrap_inner
    self.run()
  File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 754, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/Users/fermigier/envs/extranet-spr/lib/python2.7/site-packages/werkzeug/serving.py", line 659, in inner
    srv.serve_forever()
  File "/Users/fermigier/envs/extranet-spr/lib/python2.7/site-packages/werkzeug/serving.py", line 499, in serve_forever
    HTTPServer.serve_forever(self)
  File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 238, in serve_forever
    self._handle_request_noblock()
  File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 297, in _handle_request_noblock
    self.handle_error(request, client_address)
  File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 295, in _handle_request_noblock
    self.process_request(request, client_address)
  File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 321, in process_request
    self.finish_request(request, client_address)
  File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 334, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 655, in __init__
    self.handle()
  File "/Users/fermigier/envs/extranet-spr/lib/python2.7/site-packages/werkzeug/serving.py", line 216, in handle
    rv = BaseHTTPRequestHandler.handle(self)
  File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/BaseHTTPServer.py", line 340, in handle
    self.handle_one_request()
  File "/Users/fermigier/envs/extranet-spr/lib/python2.7/site-packages/werkzeug/serving.py", line 251, in handle_one_request
    return self.run_wsgi()
  File "/Users/fermigier/envs/extranet-spr/lib/python2.7/site-packages/werkzeug/serving.py", line 193, in run_wsgi
    execute(self.server.app)
  File "/Users/fermigier/envs/extranet-spr/lib/python2.7/site-packages/werkzeug/serving.py", line 186, in execute
    write(b'')
  File "/Users/fermigier/envs/extranet-spr/lib/python2.7/site-packages/werkzeug/serving.py", line 152, in write
    self.send_header(key, value)
  File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/BaseHTTPServer.py", line 401, in send_header
    self.wfile.write("%s: %s\r\n" % (keyword, value))
IOError: [Errno 32] Broken pipe

개발 μ„œλ²„( debug=True )μ—μ„œ @sfermigier 와 λ™μΌν•œ λ¬Έμ œκ°€ λ°œμƒν–ˆμœΌλ©° λ™μΌν•œ 역좔적 였λ₯˜κ°€ μžˆμŠ΅λ‹ˆλ‹€.

이 λ™μž‘μ€ 일반적으둜 맀우 κ°„λ‹¨ν•œ κ²½μš°μ— λ°œμƒν•©λ‹ˆλ‹€. μΌμ’…μ˜ μžλ™ μ™„μ„± κΈ°λŠ₯을 μ‚¬μš©ν•˜λŠ” κ²½μš°μž…λ‹ˆλ‹€. λΈŒλΌμš°μ €λŠ” 쿼리 토큰에 λŒ€ν•œ 연결을 μ‹œμž‘ν•œ λ‹€μŒ μ€‘μ§€ν•˜κ³  μΆ”κ°€ 토큰에 λŒ€ν•œ λ‹€λ₯Έ μš”μ²­μ„ μ‹œμž‘ν•©λ‹ˆλ‹€. λ§Žμ€ 깨진 νŒŒμ΄ν”„λ‘œ 끝날 κ²ƒμž…λ‹ˆλ‹€. 그리고 이것은 개발 μ„œλ²„λ₯Ό μ™„μ „νžˆ μ°¨λ‹¨ν•˜λŠ” λ§ˆμ§€λ§‰ λ¦΄λ¦¬μŠ€κΉŒμ§€λŠ” λ¬Έμ œκ°€ λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€ .
λ”°λΌμ„œ μ™„μ „ν•œ κΈ°λŠ₯을 κ°–μΆ˜ μ‘μš© ν”„λ‘œκ·Έλž¨ μ„œλ²„λ₯Ό μ‚¬μš©ν•˜λ„λ‘ μ œμ•ˆν•˜λŠ” 것이 쒋은 ν•΄κ²° λ°©λ²•μ΄μ§€λ§Œ 여기에 μ—¬μ „νžˆ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. λ¬Όλ‘  개발 μ „μš© λ¬Έμ œμ΄μ§€λ§Œ νŠΈλ¦¬κ±°ν•˜λŠ” 것이 λ„ˆλ¬΄ μΌλ°˜μ μ΄λΌλŠ” 사싀은 _ν”„λ‘œν† μ½œ λ‚΄λΆ€_에 μ΅μˆ™ν•˜μ§€ μ•Šμ€ λ§Žμ€ 개발자λ₯Ό λ°©ν•΄ν•©λ‹ˆλ‹€.
깨진 νŒŒμ΄ν”„λŠ” 맀우 일반적이며(였λ₯˜λ‘œ μΈν•œ κΈ΄ μš”μ²­κ³Ό κ°œλ°œμžκ°€ λΈŒλΌμš°μ € 쀑지 λ²„νŠΌμ„ λˆ„λ₯΄λŠ” 경우) 개발 μ„œλ²„λ₯Ό μ€‘λ‹¨ν•΄μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€.
κ·Έλƒ₯ λ‚΄ μ˜κ²¬μž…λ‹ˆλ‹€. :)

@xcash

이 λ™μž‘μ€ 일반적으둜 맀우 κ°„λ‹¨ν•œ κ²½μš°μ— λ°œμƒν•©λ‹ˆλ‹€. μΌμ’…μ˜ μžλ™ μ™„μ„± κΈ°λŠ₯을 μ‚¬μš©ν•˜λŠ” κ²½μš°μž…λ‹ˆλ‹€. λΈŒλΌμš°μ €λŠ” 쿼리 토큰에 λŒ€ν•œ 연결을 μ‹œμž‘ν•œ λ‹€μŒ μ€‘μ§€ν•˜κ³  μΆ”κ°€ 토큰에 λŒ€ν•œ λ‹€λ₯Έ μš”μ²­μ„ μ‹œμž‘ν•©λ‹ˆλ‹€.

관련이 μžˆλŠ” 경우 browsersync with gulp.js μ‚¬μš©ν•˜μ—¬ 이 λ¬Έμ œκ°€ λ°œμƒν–ˆμŒμ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

WSGI μ„œλ²„ 싀행을 ν¬ν•¨ν•˜μ§€ μ•ŠλŠ” μ†”λ£¨μ…˜μ΄ μžˆλŠ” μ‚¬λžŒμ΄ μžˆμŠ΅λ‹ˆκΉŒ? λ‚΄ ν˜ΈμŠ€νŠΈμ— λŒ€ν•΄ SYN μŠ€μΊ”μ„ μˆ˜ν–‰ν•˜λŠ” λ΄‡μ—μ„œ 이 λ¬Έμ œκ°€ λ°œμƒν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

@glennzw κ·€ν•˜μ˜ ν™˜κ²½μ— λŒ€ν•΄ 더 ꡬ체적으둜

FWIW, λ‚˜λŠ” 릴리슀λ₯Ό 많이 따라 μž‘μ§€ λͺ»ν–ˆκ³ μ΄ (맀우 μ„±κ°€μ‹ ) λ¬Έμ œκ°€ 2016 λ…„ 5 μ›”μ—μ„œ 8 μ›” 사이에 λ°œμƒν•˜κΈ° μ‹œμž‘ν–ˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 이것을 λ‚΄ setup.py install_requires = ['Werkzeug<0.11', 'flask<0.11', ... μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€. 이것은 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€(IME, Werkzeugλ₯Ό κ³ μ •ν•˜λŠ” κ²ƒλ§ŒμœΌλ‘œλŠ” νŠΈλ¦­μ„ μˆ˜ν–‰ν•˜μ§€ μ•ŠλŠ” 것 κ°™μŠ΅λ‹ˆκΉŒ?)

λ‚˜μ—κ²Œ 볡제 μ‚¬λ‘€λŠ” μΆ©λΆ„νžˆ κ°„λ‹¨ν–ˆμŠ΅λ‹ˆλ‹€. νŽ˜μ΄μ§€λ₯Ό λ‘œλ“œν•˜μ§€λ§Œ λ‘œλ“œκ°€ μ™„λ£Œλ˜μ§€ μ•Šλ„λ‘ ν•˜μ‹­μ‹œμ˜€. 즉, _any_ 깨진 νŒŒμ΄ν”„ 였λ₯˜λ₯Ό νŠΈλ¦¬κ±°ν•˜λ©΄ μ›Ή μ„œλ²„κ°€ μΆ©λŒν•˜κ³  λ‹€λ₯Έ μš”μ²­μ„ μ²˜λ¦¬ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€. IMHO, μ›Ή μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ 연결을 쑰기에 닫을 λ•Œ _ λ„˜μ–΄μ§ˆ 수 μ—†μŠ΅λ‹ˆλ‹€_. 심지어 개발 쀑인 연결도 ν¬ν•¨λ©λ‹ˆλ‹€.

λͺ¨λ‘ passthrough_errors κ°€ μ–΄λ”˜κ°€μ— μ„€μ •λ˜μ–΄ μžˆμ§€ μ•Šμ„κΉŒμš”?

@untitaker 이 경우, νŒ”λ ˆνŠΈ/ν”ŒλΌμŠ€ν¬#1674 νŒ”λ ˆνŠΈ/ν”ŒλΌμŠ€ν¬#1679 νŒ”λ ˆνŠΈ/ν”ŒλΌμŠ€ν¬#1928 관련이 μžˆμŠ΅λ‹ˆκΉŒ?

잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. 기자 쀑 ν•œ λͺ…이 확인해 μ£Όμ…¨μœΌλ©΄ ν•©λ‹ˆλ‹€.

2016λ…„ 8μ›” 26일 17:05:25 CEST에 David Lord [email protected] 은 λ‹€μŒκ³Ό 같이 μΌμŠ΅λ‹ˆλ‹€.

@untitaker 이 경우, νŒ”λ ˆνŠΈ/ν”ŒλΌμŠ€ν¬#1674 νŒ”λ ˆνŠΈ/ν”ŒλΌμŠ€ν¬#1679
νŒ”λ ˆνŠΈ/ν”ŒλΌμŠ€ν¬#1928 κ΄€λ ¨ κ°€λŠ₯성이 μžˆμŠ΅λ‹ˆκΉŒ?

당신이 μ–ΈκΈ‰λ˜μ—ˆκΈ° λ•Œλ¬Έμ— 이것을 λ°›λŠ” κ²ƒμž…λ‹ˆλ‹€.
이 이메일에 직접 λ‹΅μž₯ν•˜κ±°λ‚˜ GitHubμ—μ„œ ν™•μΈν•˜μ„Έμš”.
https://github.com/pallets/werkzeug/issues/954#issuecomment -242761250

K-9 Mail을 μ‚¬μš©ν•˜μ—¬ Android κΈ°κΈ°μ—μ„œ λ³΄λƒˆμŠ΅λ‹ˆλ‹€. 제 κ°„λž΅ν•¨μ„ μš©μ„œν•˜μ‹­μ‹œμ˜€.

cc @miguelgrinberg

WerkzeugλŠ” 깨진 νŒŒμ΄ν”„ 및 μ—°κ²° μž¬μ„€μ • 였λ₯˜λ₯Ό μ²˜λ¦¬ν•΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. 이것은 μ‹€μ œλ‘œ 였λ₯˜μ˜ ν‘œμ‹œκ°€ μ•„λ‹ˆλ©° ν΄λΌμ΄μ–ΈνŠΈκ°€ 방금 μ‚¬λΌμ‘ŒμŠ΅λ‹ˆλ‹€. 이 경우 였λ₯˜ νŒ¨μŠ€μŠ€λ£¨κ°€ μ„€μ •λ˜μ–΄ μžˆλ”λΌλ„ μœ„μ˜ 포괄 λ°©μ‹μ—μ„œ λ¬΄μ‹œν•  μ˜ˆμ™Έλ‘œ μΈμ‹λ˜λŠ” νŠΉλ³„ν•œ μ˜ˆμ™Έκ°€ λ°œμƒν•΄μ•Ό ν•©λ‹ˆλ‹€.

gunicorn이 μˆ˜ν–‰ν•˜λŠ” 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. https://github.com/benoitc/gunicorn/blob/39f62ac66beaf83ceccefbfabd5e3af7735d2aff/gunicorn/workers/sync.py#L151 -L154

그것이 ν•΄μ•Ό ν•  μΌμž…λ‹ˆλ‹€. λ²ˆμ‹ 방법을 μ•Œμ•„λ³΄λ €κ³  ν•©λ‹ˆλ‹€
이 λ™μž‘μ΄μ§€λ§Œ 아직 μ‚¬μš©ν•  수 μžˆλŠ” λͺ…ν™•ν•œ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€κ°€ μ—†μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 질문
μ•½ passthrough_errors .

λ‚˜λŠ” 이것이 Werkzeug의 버그가 μ•„λ‹ˆλ©° μ‚¬μš©μžμ˜ λΈŒλΌμš°μ €κ°€
λ‹€λ₯Έ μš”μ²­μ„ μ°¨λ‹¨ν•˜λŠ” 연결이 아직 μ—΄λ € μžˆμŠ΅λ‹ˆλ‹€(λŒ€μ‹ 
μ„œλ²„ 좩돌). λΈŒλΌμš°μ €λ₯Ό λ‹«μ•˜λ‹€κ°€ λ‹€μ‹œ μ—΄λ©΄ μ„œλ²„κ°€
λ‹€μ‹œ κΈ°λŠ₯.

2016λ…„ 8μ›” 26일 κΈˆμš”μΌ μ˜€μ „ 11:54:16 -0700에 Miguel GrinbergλŠ” λ‹€μŒκ³Ό 같이 μΌμŠ΅λ‹ˆλ‹€.

WerkzeugλŠ” 깨진 νŒŒμ΄ν”„ 및 μ—°κ²° μž¬μ„€μ • 였λ₯˜λ₯Ό μ²˜λ¦¬ν•΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. 이것은 μ‹€μ œλ‘œ 였λ₯˜μ˜ ν‘œμ‹œκ°€ μ•„λ‹ˆλ©° ν΄λΌμ΄μ–ΈνŠΈκ°€ 방금 μ‚¬λΌμ‘ŒμŠ΅λ‹ˆλ‹€. 이 경우 였λ₯˜ νŒ¨μŠ€μŠ€λ£¨κ°€ μ„€μ •λ˜μ–΄ μžˆλ”λΌλ„ μœ„μ˜ 포괄 λ°©μ‹μ—μ„œ λ¬΄μ‹œν•  μ˜ˆμ™Έλ‘œ μΈμ‹λ˜λŠ” νŠΉλ³„ν•œ μ˜ˆμ™Έκ°€ λ°œμƒν•΄μ•Ό ν•©λ‹ˆλ‹€.

gunicorn이 μˆ˜ν–‰ν•˜λŠ” 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. https://github.com/benoitc/gunicorn/blob/39f62ac66beaf83ceccefbfabd5e3af7735d2aff/gunicorn/workers/sync.py#L151 -L154

당신이 μ–ΈκΈ‰λ˜μ—ˆκΈ° λ•Œλ¬Έμ— 이것을 λ°›λŠ” κ²ƒμž…λ‹ˆλ‹€.
이 이메일에 직접 λ‹΅μž₯ν•˜κ±°λ‚˜ GitHubμ—μ„œ ν™•μΈν•˜μ„Έμš”.
https://github.com/pallets/werkzeug/issues/954#issuecomment -242821084

μ•„, 그리고 깨진 νŒŒμ΄ν”„ 였λ₯˜κ°€ _are_ ν‘œμ‹œλ©λ‹ˆλ‹€. 예, ν•˜μ§€λ§Œ μ„€λͺ…λœ λŒ€λ‘œ μ„œλ²„λ₯Ό λŠμ§€ μ•Šμ•„μ•Ό ν•©λ‹ˆλ‹€. κ°€λŠ₯ν•œ μ΄μœ μ— λŒ€ν•œ 이전 μ˜κ²¬μ„ μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.

μ΅œμ‹  λΉ„νŠΈλ₯Ό λ‹€μ‹œ ν…ŒμŠ€νŠΈν–ˆλŠ”λ° μ—¬μ „νžˆ λ‚΄ ν™˜κ²½μ—μ„œ λ™μΌν•œ λ™μž‘μ΄ ν‘œμ‹œλ©λ‹ˆλ‹€. ν•˜μ§€λ§Œ μž¬μƒμ‚°μ— λ¬Έμ œκ°€ μžˆλŠ” 것 κ°™μ•„μ„œ λ‚΄κ°€ νŠΉλ³„ν•œ 이유λ₯Ό κΊΌλ‚΄λ €κ³  ν–ˆμŠ΅λ‹ˆλ‹€.

import time
from flask import Flask
app = Flask(__name__)


@app.route('/')
def hello_world():
    time.sleep(5)
    return 'Hello, World!'


if __name__ == "__main__":
    app.run()

flask run 둜 μ˜ˆμƒλŒ€λ‘œ μž‘λ™ν•˜μ§€λ§Œ python hello.py λ₯Ό 톡해 μ‹œμž‘ν•  λ•Œ 응닡이 λ Œλ”λ§λ˜λ„λ‘ ν•˜κΈ° 전에 μ›Ή λΈŒλΌμš°μ €λ₯Ό λ‹«μœΌλ©΄ μ›Ή μ„œλ²„κ°€ μΆ©λŒν•©λ‹ˆλ‹€.

μ‘λ‹΅μ˜ 일뢀가 μ†μ‹€λœ 것 κ°™μŠ΅λ‹ˆλ‹€.

2016λ…„ 8μ›” 26일 κΈˆμš”μΌ μ˜€ν›„ 12:29:39 -0700에 ClaygλŠ” λ‹€μŒκ³Ό 같이 μΌμŠ΅λ‹ˆλ‹€.

μ΅œμ‹  λΉ„νŠΈλ₯Ό λ‹€μ‹œ ν…ŒμŠ€νŠΈν–ˆλŠ”λ° μ—¬μ „νžˆ λ‚΄ ν™˜κ²½μ—μ„œ λ™μΌν•œ λ™μž‘μ΄ ν‘œμ‹œλ©λ‹ˆλ‹€. ν•˜μ§€λ§Œ μž¬μƒμ‚°μ— λ¬Έμ œκ°€ μžˆλŠ” 것 κ°™μ•„μ„œ λ‚΄κ°€ νŠΉλ³„ν•œ 이유λ₯Ό κΊΌλ‚΄λ €κ³  ν–ˆμŠ΅λ‹ˆλ‹€.

You are receiving this because you were mentioned.
Reply to this email directly or view it on GitHub:
https://github.com/pallets/werkzeug/issues/954#issuecomment-242829536

예, slackμ—μ„œ νŠΈλ¦¬ν”Œ 틱은 견적을 μ°¨λ‹¨ν•˜λŠ” 방법이고 ctrl-return λŠ” 쀄 λ°”κΏˆμ„ ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.
githubμ—μ„œ νŠΈλ¦¬ν”Œ 틱은 견적을 μ°¨λ‹¨ν•˜λŠ” λ°©λ²•μ΄μ§€λ§Œ ctrl-return λŠ” μ œμΆœν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.
... μ–΄μ¨Œλ“  ... 근윑 κΈ°μ–΅

λ‚˜λŠ” μ™„λ£Œν•˜κΈ° μœ„ν•΄ μ œμΆœν•œ 직후에 λ‚΄ κ²Œμ‹œλ¬Όμ„ νŽΈμ§‘ν–ˆμŠ΅λ‹ˆλ‹€. 그리고 λ‚˜λŠ” 당신이 μ΄λ©”μΌμ—μ„œ λ‹΅μž₯ν•˜λŠ” κ²ƒμ²˜λŸΌ 보이기 λ•Œλ¬Έμ— λ‹΅μž₯을 ν•˜λŠ” 것뿐이며, githubμ—μ„œ λ‚˜μ˜ νŽΈμ§‘ 후에 또 λ‹€λ₯Έ 톡지λ₯Ό 보낼지 확신이 μ„œμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μœ„ @clayg 의 수면 ν…ŒμŠ€νŠΈλ‘œλŠ” μž¬ν˜„ν•  수 μ—†μŠ΅λ‹ˆλ‹€. μ‹€μ œλ‘œ 깨진 νŒŒμ΄ν”„ 였λ₯˜κ°€ μ „ν˜€ λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν•΄λ‹Ή μš”μ²­μ΄ 응닡을 λ°˜ν™˜ν•˜κΈ° 전에 λΈŒλΌμš°μ €λ₯Ό λ‹«μ§€λ§Œ WerkzeugλŠ” μ–΄μ¨Œλ“  λκΉŒμ§€ μš”μ²­μ„ μˆ˜ν–‰ν•˜κ³  200개의 둜그 라인을 μ½˜μ†”μ— μΈμ‡„ν•˜κ³  였λ₯˜λ₯Ό ν‘œμ‹œν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” λ˜ν•œ 슀트리밍 응닡을 μ‚¬μš©ν•˜μ—¬ λμ—†λŠ” μŠ€νŠΈλ¦Όμ—μ„œ λΉ„λ””μ˜€ ν”„λ ˆμž„μ„ μ œκ³΅ν•˜λŠ” ν”ŒλΌμŠ€ν¬ λΉ„λ””μ˜€ 슀트리밍 예제λ₯Ό μ‚¬μš©ν•˜μ—¬ λ™μΌν•œ νŠΈλ¦­μ„ μ‹œλ„ν–ˆμœΌλ©°, κ·Έ κ²½μš°μ—λ„ λΈŒλΌμš°μ €λ₯Ό 닫을 수 있고 였λ₯˜ 없이 μš”μ²­μ΄ μ’…λ£Œλ©λ‹ˆλ‹€. 이것은 μ΄μƒν•©λ‹ˆλ‹€. 과거에 이 μ‘μš© ν”„λ‘œκ·Έλž¨μ΄ μš”μ²­μ„ μ’…λ£Œν•˜κΈ° 전에 μ½˜μ†”μ— 깨진 νŒŒμ΄ν”„ 였λ₯˜λ₯Ό μœ λ°œν•  것이라고 ν™•μ‹ ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

사싀 λ„ˆλ¬΄ 빨리 λ§ν–ˆμ–΄μš”. Python 2.7을 μ‚¬μš©ν•  λ•Œ λΉ„λ””μ˜€ 슀트리밍 μ•±μœΌλ‘œ 맀번 μž¬μƒμ‚°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 3.5μ—μ„œ μž¬μƒμ‚°ν•  수 μ—†μŠ΅λ‹ˆλ‹€. μœ„μ˜ λͺ¨λ“  μŠ€νƒ 좔적은 2.7에 λŒ€ν•œ κ²ƒμ΄λ―€λ‘œ Python 3으둜 ν…ŒμŠ€νŠΈν•˜λŠ” 경우 염두에 λ‘μ‹­μ‹œμ˜€.

ν₯미둜운 데이터 ν¬μΈνŠΈκ°€ ν•˜λ‚˜ 더 μžˆμŠ΅λ‹ˆλ‹€. reloader둜 μ‹€ν–‰ν•˜λ©΄ μžμ‹ ν”„λ‘œμ„ΈμŠ€κ°€ μ’…λ£Œλ˜λ©΄ reloaderλ₯Ό μ‹€ν–‰ν•˜λŠ” λ§ˆμŠ€ν„° ν”„λ‘œμ„ΈμŠ€κ°€ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹œμž‘ν•˜λ―€λ‘œ 쀑단이 μ—†μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ¦¬λ‘œλ” 없이 μ„œλ²„λ₯Ό μ‹€ν–‰ν•˜λŠ” 경우 깨진 νŒŒμ΄ν”„ 였λ₯˜λ‘œ 인해 μ½˜μ†”λ‘œ λŒμ•„κ°‘λ‹ˆλ‹€.

νŽΈμ§‘: λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€ 뢀뢄을 μ‹œμž‘ν•˜λŠ” λ¦¬λ‘œλ”λ₯Ό λ¬΄μ‹œν•˜μ‹­μ‹œμ˜€. μ΄λŠ” λ°œμƒν•˜μ§€ μ•ŠλŠ” 것 κ°™κ³  λŒ€μ‹  톡과 였λ₯˜ 섀정을 λ³€κ²½ν•˜λŠ” 효과λ₯Ό 보고 μžˆμ—ˆλ˜ 것 κ°™μŠ΅λ‹ˆλ‹€.

μ’‹μ•„, μ—¬κΈ° λ‚΄κ°€ μƒκ°ν•˜λŠ” 일에 λŒ€ν•œ 뢄석이 μžˆμŠ΅λ‹ˆλ‹€.

  • ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­ 쀑간에 사라짐
  • μš”μ²­μ΄ κ³„μ†λ©λ‹ˆλ‹€. μ†ŒμΌ“ 연결이 λ²„νΌλ§λœ κ²ƒμœΌλ‘œ λ³΄μ΄λ―€λ‘œ λŒ€λΆ€λΆ„μ˜ 경우 μ†ŒμΌ“μ— μ“°κΈ° μž‘μ—…μ„ μˆ˜ν–‰ν•΄λ„ λ¬Έμ œκ°€ λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • μš”μ²­μ΄ λλ‚˜λ©΄ μ†ŒμΌ“ μ„œλ²„ ν΄λž˜μŠ€λŠ” μ†ŒμΌ“μ—μ„œ flush() λ₯Ό λ°œν–‰ν•©λ‹ˆλ‹€. 이것은 ν˜„μž¬ μˆ˜μ •λœ Python 라이브러리의 였래된 λ²„κ·Έμ˜ μ£Όμ œμ˜€μŠ΅λ‹ˆλ‹€: http://bugs.python.org/issue14574. 이 μˆ˜μ •μ˜ 해결책은 socket.error λ₯Ό ν¬μ°©ν•˜κ³  λ¬΄μ‹œν•˜λŠ” κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€.
  • 그런 λ‹€μŒ μ†ŒμΌ“ μ„œλ²„λŠ” 연결을 λ‹«μœΌλ €κ³  ν•©λ‹ˆλ‹€. 이것은 OP의 μ—­μΆ”μ μ—μ„œ κ°€μ Έμ˜¨ λ‹€μŒ μŠ€νƒ ν”„λ ˆμž„μž…λ‹ˆλ‹€.

File "/usr/lib/python2.7/SocketServer.py", line 710, in finish self.wfile.close()

  • λΆˆν–‰νžˆλ„ Python 2.7μ—μ„œ socket.close() λ©”μ„œλ“œκ°€ μˆ˜ν–‰ν•˜λŠ” 첫 번째 μž‘μ—…μ€ λ‹€μ‹œ ν”ŒλŸ¬μ‹œν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

File "/usr/lib/python2.7/socket.py", line 279, in close self.flush()

  • 이 두 번째 ν”ŒλŸ¬μ‹œ μ‹œλ„λŠ” try/except둜 λ³΄ν˜Έλ˜μ§€ μ•ŠμœΌλ―€λ‘œ EPIPE μ˜ˆμ™Έκ°€ λ°œμƒν•©λ‹ˆλ‹€.
  • μ†ŒμΌ“ μ„œλ²„λŠ” μ˜ˆμ™Έλ₯Ό ν¬μ°©ν•œ λ‹€μŒ μ„œλ²„μ˜ handle_error() λ©”μ„œλ“œμ— μ „λ‹¬ν•©λ‹ˆλ‹€.
  • handle_error() 의 Werkzeug κ΅¬ν˜„μ€ passthrough_errors 섀정을 μ‚΄νŽ΄λ³΄κ³  항상 True μ„€μ •ν–ˆκΈ° λ•Œλ¬Έμ— EPIPE 였λ₯˜λ₯Ό λ‹€μ‹œ λ°œμƒμ‹œν‚€κ³  λ²„λΈ”λ§λ˜λ„λ‘ ν•©λ‹ˆλ‹€. 맨 μœ„.

Python 3의 μ†ŒμΌ“ μ½”λ“œλŠ” μ™„μ „νžˆ λ‹€λ₯΄λ©°, 특히 주변에 try/exceptκ°€ μ—†λŠ” ν”ŒλŸ¬μ‹œ 호좜이 μ—†λŠ” κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€. EPIPE 였λ₯˜λŠ” Python 3을 μ‚¬μš©ν•  λ•Œ WerkzeugκΉŒμ§€ 버블링쑰차 λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

passthrough_errorsκ°€ true둜 μ„€μ •λ˜μ–΄ μžˆμŠ΅λ‹ˆκΉŒ? Werkzeugμ—μ„œλŠ” 기본적으둜 falseμž…λ‹ˆλ‹€.

2016λ…„ 8μ›” 27일 02:10:13 CESTμ—μ„œ Miguel Grinberg [email protected] 은 λ‹€μŒκ³Ό 같이 μΌμŠ΅λ‹ˆλ‹€.

μ’‹μ•„, μ—¬κΈ° λ‚΄κ°€ μƒκ°ν•˜λŠ” 일에 λŒ€ν•œ 뢄석이 μžˆμŠ΅λ‹ˆλ‹€.

  • ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­ 쀑간에 사라짐
  • μš”μ²­μ΄ κ³„μ†λ©λ‹ˆλ‹€. μ†ŒμΌ“ 연결은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
    λ²„νΌλ§λ˜μ–΄ μžˆμœΌλ―€λ‘œ λŒ€λΆ€λΆ„μ˜ 경우 μ†ŒμΌ“μ— λŒ€ν•œ μ“°κΈ°λŠ”
    문제.
  • μš”μ²­μ΄ λλ‚˜λ©΄ μ†ŒμΌ“ μ„œλ²„ ν΄λž˜μŠ€λŠ” flush() λ°œν–‰ν•©λ‹ˆλ‹€.
    μ†ŒμΌ“μ—. 이것은 Python 라이브러리의 였래된 λ²„κ·Έμ˜ μ£Όμ œμ˜€μŠ΅λ‹ˆλ‹€.
    ν˜„μž¬ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€: http://bugs.python.org/issue14574. NS
    이 μˆ˜μ •μ˜ 해결책은 socket.error λ₯Ό ν¬μ°©ν•˜κ³  λ¬΄μ‹œν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.
  • 그런 λ‹€μŒ μ†ŒμΌ“ μ„œλ²„λŠ” 연결을 λ‹«μœΌλ €κ³  ν•©λ‹ˆλ‹€. 이것이
    OP의 μ—­μΆ”μ μ—μ„œ λ‹€μŒ μŠ€νƒ ν”„λ ˆμž„:
 File "/usr/lib/python2.7/SocketServer.py", line 710, in finish
 self.wfile.close()

  • λΆˆν–‰νžˆλ„ Python 2.7μ—μ„œ κ°€μž₯ λ¨Όμ € socket.close()
    λ©”μ†Œλ“œλŠ” λ‹€μ‹œ ν”ŒλŸ¬μ‹œλ©λ‹ˆλ‹€.
 File "/usr/lib/python2.7/socket.py", line 279, in close
 self.flush()

  • 이 두 번째 ν”ŒλŸ¬μ‹œ μ‹œλ„λŠ” try/except둜 λ³΄ν˜Έλ˜μ§€ μ•ŠμœΌλ―€λ‘œ
    EPIPE μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€.
  • μ†ŒμΌ“ μ„œλ²„λŠ” μ˜ˆμ™Έλ₯Ό ν¬μ°©ν•œ λ‹€μŒ μ˜ˆμ™Έλ₯Ό μ „λ‹¬ν•©λ‹ˆλ‹€.
    μ„œλ²„μ˜ handle_error() λ©”μ†Œλ“œ.
  • handle_error() 의 Werkzeug κ΅¬ν˜„μ€
    passthrough_errors 섀정이며 항상 λ‹€μŒμœΌλ‘œ μ„€μ •λ˜μ–΄ μžˆμœΌλ―€λ‘œ
    True , EPIPE 였λ₯˜λ₯Ό λ‹€μ‹œ λ°œμƒμ‹œν‚€κ³  μœ„λ‘œ λ²„λΈ”λ§λ˜λ„λ‘ ν•©λ‹ˆλ‹€.

Python 3의 μ†ŒμΌ“ μ½”λ“œλŠ” μ™„μ „νžˆ λ‹€λ₯΄λ©°, 특히,
주변에 try/except 없이 ν”ŒλŸ¬μ‹œ 호좜이 μ—†λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.
그듀을. EPIPE 였λ₯˜λŠ” μ‚¬μš©ν•  λ•Œ WerkzeugκΉŒμ§€ λ²„λΈ”λ§λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
파이썬 3.

당신이 μ–ΈκΈ‰λ˜μ—ˆκΈ° λ•Œλ¬Έμ— 이것을 λ°›λŠ” κ²ƒμž…λ‹ˆλ‹€.
이 이메일에 직접 λ‹΅μž₯ν•˜κ±°λ‚˜ GitHubμ—μ„œ ν™•μΈν•˜μ„Έμš”.
https://github.com/pallets/werkzeug/issues/954#issuecomment -242881523

K-9 Mail을 μ‚¬μš©ν•˜μ—¬ Android κΈ°κΈ°μ—μ„œ λ³΄λƒˆμŠ΅λ‹ˆλ‹€. 제 κ°„λž΅ν•¨μ„ μš©μ„œν•˜μ‹­μ‹œμ˜€.

였, 에헴: https://github.com/pallets/flask/pull/1679

passthrough_errors λŠ” app.debug 에 μ˜μ‘΄ν•΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. NVM은 μ“Έλͺ¨κ°€ μ—†λ‹€

μ‹€μ œλ‘œ ν•΄λ‹Ή PR을 λ˜λŒλ¦¬λŠ” 것 μ™Έμ—λŠ” λ‹€λ₯Έ μ˜΅μ…˜μ΄ μ—†μŠ΅λ‹ˆλ‹€. passthrough_errors=True ν”„λ‘œκ·Έλž¨μ— 디버거λ₯Ό μ—°κ²°ν•˜μ§€ μ•Šμ€ 경우 쒋은 κΈ°λ³Έ λ™μž‘μ΄ μ•„λ‹™λ‹ˆλ‹€.

λ‹€λ₯Έ 방법을 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€. 두 가지 PR:

  • https://github.com/pallets/flask/pull/1996 -- 트레이슀백이 μ—¬μ „νžˆ ν‘œμ‹œλœλ‹€λŠ” 점을 μ œμ™Έν•˜κ³  자체적으둜 문제λ₯Ό ν•΄κ²°ν•©λ‹ˆλ‹€.
  • https://github.com/pallets/werkzeug/pull/998 -- passthrough_errors=True 인 κ²½μš°μ—λ„ μ†ŒμΌ“ 였λ₯˜λ₯Ό λ‹€μ‹œ λ°œμƒμ‹œν‚€μ§€ λ§ˆμ‹­μ‹œμ˜€. μ–΄μ¨Œλ“  그런 μ˜λ„λŠ” μ•„λ‹Œ 것 κ°™μ•„μš”

λ‘˜ λ‹€ 넓은 μ˜λ―Έμ—μ„œ λ™μž‘ λ³€κ²½μ΄λ―€λ‘œ λ°±ν¬νŠΈν•˜μ§€ μ•ŠλŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

https://github.com/pallets/flask/pull/1996 이 ν—ˆμš© κ°€λŠ₯ν•œ μ†”λ£¨μ…˜μ΄λΌκ³  μƒκ°ν•©λ‹ˆλ‹€. μ€‘μš”ν•œ 것은 μ˜ˆμ™Έκ°€ μ „νŒŒλ˜λŠ” 것을 μ›ν•˜μ§€ μ•ŠλŠ” 일반적인 경우λ₯Ό μˆ˜μ •ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. μ „νŒŒν•˜κ³  μ‹Άλ‹€λ©΄ 디버깅 쀑이며, 이 경우 socket.errorκ°€ μ „νŒŒλ˜μ–΄μ„œλŠ” μ•ˆ 될 λ•Œ μ „νŒŒλ˜λŠ” 것은 큰 λ¬Έμ œκ°€ μ•„λ‹™λ‹ˆλ‹€.

https://github.com/pallets/werkzeug/pull/998 μˆ˜μ •μ€ 쒋지 μ•ŠμŠ΅λ‹ˆλ‹€. μ‘μš© ν”„λ‘œκ·Έλž¨μ€ 자체 처리기의 μ†ŒμΌ“μœΌλ‘œ μˆ˜ν–‰ν•˜λŠ” μž‘μ—…μ—μ„œ ν•©λ²•μ μœΌλ‘œ μ΄λŸ¬ν•œ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¬ 수 있으며 μ΄λŸ¬ν•œ μ˜ˆμ™Έλ„ 묡음 μ²˜λ¦¬λ©λ‹ˆλ‹€. 이상적인 μ†”λ£¨μ…˜μ€ μ΄λŸ¬ν•œ λ¬Έμ œκ°€ λ°œμƒν•œ μœ„μΉ˜μ—μ„œ 포착된 λ‹€μŒ handle_error κ°€ μΈμ‹ν•˜κ³  λ¬΄μ‹œν•  수 μžˆλŠ” 일뢀 μ‚¬μš©μž μ •μ˜ μ˜ˆμ™Έ 클래슀둜 λ‹€μ‹œ λ°œμƒμ‹œν‚€λŠ” κ²ƒμž…λ‹ˆλ‹€. SocketServer λ₯Ό λ³€κ²½ν•˜κ±°λ‚˜ μ˜€λ²„λ‘œλ“œν•˜μ§€ μ•ŠμœΌλ €λŠ” 경우 이 뢀뢄을 κ·ΈλŒ€λ‘œ λ‘λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. EPIPEλŠ” μ½˜μ†”μ— λ€ν”„λ˜μ§€λ§Œ Python 2μ—μ„œλ§Œ κ°€λŠ₯ν•˜λ©° 적어도 λ‹€λ₯Έ μˆ˜μ • 사항이 적용된 후에도 μ„œλ²„λ₯Ό μ€‘μ§€ν•˜μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€. λ¬΄ν•΄ν•˜κ³  과거에 μ‘΄μž¬ν–ˆλ˜ λ™μž‘μž…λ‹ˆλ‹€. passthrough_errors λ³€κ²½.

μ„€λͺ…ν•˜λŠ” λ™μž‘μ€ PASSTHROUGH_ERRORSκ°€ ν™œμ„±ν™”λœ κ²½μš°μ—λ§Œ λ°œμƒν•©λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ Flask λ‚΄μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•©λ‹ˆλ‹€.

λ‚˜λŠ”μ΄ 미용 κ°œμ„ μ΄ κ°€μΉ˜κ°€ μ—†λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

2016λ…„ 8μ›” 27일 18:29:30 CEST에 Miguel Grinberg [email protected] 은 λ‹€μŒκ³Ό 같이 μΌμŠ΅λ‹ˆλ‹€.

https://github.com/pallets/flask/pull/1996 이 ν—ˆμš©λœλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.
ν•΄κ²°μ±…. μ€‘μš”ν•œ 것은 λ‹€μŒκ³Ό 같은 일반적인 경우λ₯Ό μˆ˜μ •ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.
μ˜ˆμ™Έκ°€ μ „νŒŒλ˜λŠ” 것을 μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ „νŒŒν•˜κ³  μ‹Άλ‹€λ©΄,
그런 λ‹€μŒ 디버깅 쀑이며이 경우 socket.errorκ°€ λ°œμƒν•©λ‹ˆλ‹€.
μ „νŒŒλ˜μ§€ μ•Šμ•„μ•Ό ν•  λ•Œ μ „νŒŒλ˜λŠ” 것은 큰 λ¬Έμ œκ°€ μ•„λ‹™λ‹ˆλ‹€.

https://github.com/pallets/werkzeug/pull/998 μˆ˜μ •μ΄ 쒋지 μ•ŠμŠ΅λ‹ˆλ‹€.
κ·Έλ ‡μ§€λ§Œ. μ‘μš© ν”„λ‘œκ·Έλž¨μ€ λ‹€μŒμ—μ„œ ν•©λ²•μ μœΌλ‘œ μ΄λŸ¬ν•œ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.
자체 ν•Έλ“€λŸ¬μ˜ μ†ŒμΌ“μœΌλ‘œ μˆ˜ν–‰ν•˜λŠ” μž‘μ—…
μΉ¨λ¬΅ν•˜κΈ°λ„ ν•œλ‹€. 이상적인 해결책은 이것듀을 μž‘λŠ” κ²ƒμž…λ‹ˆλ‹€.
그듀이 λ°œμƒν•˜λŠ” μž₯μ†Œμ—μ„œ λ‹€μŒ 일뢀 μ‚¬μš©μž μ •μ˜ μ˜ˆμ™Έλ‘œ λ‹€μ‹œ λ°œμƒν•©λ‹ˆλ‹€.
handle_error κ°€ μΈμ‹ν•˜κ³  λ¬΄μ‹œν•  수 μžˆλŠ” ν΄λž˜μŠ€μž…λ‹ˆλ‹€. μš°λ¦¬κ°€
μ•„λ§ˆλ„ SocketServer λ₯Ό λ³€κ²½ν•˜κ±°λ‚˜ κ³ΌλΆ€ν•˜ν•˜κ³  싢지 μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€. 제 μƒκ°μ—λŠ”
νˆ¬ν‘œλŠ” 이 뢀뢄을 κ·ΈλŒ€λ‘œ λ‘λŠ” κ²ƒμž…λ‹ˆλ‹€. 당신은 EPIPEλ₯Ό 덀프 ν•  κ²ƒμž…λ‹ˆλ‹€
μ½˜μ†”μ΄μ§€λ§Œ Python 2μ—μ„œλ§Œ κ°€λŠ₯ν•˜λ©° 적어도 λ©ˆμΆ”μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€.
λ‹€λ₯Έ μˆ˜μ • 사항 이후에 μ„œλ²„κ°€ λ“€μ–΄κ°‘λ‹ˆλ‹€. λ¬΄ν•΄ν•˜κ³ 
λ‚΄κ°€ λ§Œλ“€κΈ° 전에 과거에 μ‘΄μž¬ν–ˆλ˜ 행동
passthrough_errors λ³€κ²½.

당신이 μ–ΈκΈ‰λ˜μ—ˆκΈ° λ•Œλ¬Έμ— 이것을 λ°›λŠ” κ²ƒμž…λ‹ˆλ‹€.
이 이메일에 직접 λ‹΅μž₯ν•˜κ±°λ‚˜ GitHubμ—μ„œ ν™•μΈν•˜μ„Έμš”.
https://github.com/pallets/werkzeug/issues/954#issuecomment -242926832

K-9 Mail을 μ‚¬μš©ν•˜μ—¬ Android κΈ°κΈ°μ—μ„œ λ³΄λƒˆμŠ΅λ‹ˆλ‹€. 제 κ°„λž΅ν•¨μ„ μš©μ„œν•˜μ‹­μ‹œμ˜€.

λ§ˆμŠ€ν„°μ—μ„œ μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€.

μ„€λͺ…ν•˜λŠ” λ™μž‘μ€ PASSTHROUGH_ERRORSκ°€ ν™œμ„±ν™”λœ κ²½μš°μ—λ§Œ λ°œμƒν•©λ‹ˆλ‹€.

예, λ‚˜λŠ” κ·Έ μ„ΈλΆ€ 사항을 μƒλž΅ν–ˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 이 변경은 이 쀑 μ–΄λŠ 것도 λ¬Έμ œκ°€ λ˜μ§€ μ•ŠλŠ” Python 3에도 영ν–₯을 λ―ΈμΉ©λ‹ˆλ‹€. Py3μ—μ„œ 톡과 였λ₯˜κ°€ ν™œμ„±ν™”λ˜λ©΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λ°œμƒν•˜λŠ” 합법적인 socket.errorκ°€ μΉ¨λ¬΅λ©λ‹ˆλ‹€.

masterλŠ” wfm인 것 κ°™μŠ΅λ‹ˆλ‹€. λ‹€μŒ 릴리슀λ₯Ό κΈ°λŒ€ν•©λ‹ˆλ‹€. κ°μ‚¬ν•©λ‹ˆλ‹€!

μ•ˆλ…•ν•˜μ„Έμš”, μ €λŠ” NGINX λ’€μ—μ„œ μ‹€ν–‰λ˜λŠ” Werkzeug 개발 μ„œλ²„λ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. λ™μΌν•œ λ¬Έμ œμ— 직면해 μžˆμŠ΅λ‹ˆλ‹€. λˆ„κ΅¬λ“ μ§€ 이 문제λ₯Ό ν•΄κ²°ν•΄ 쀄 수 μžˆμŠ΅λ‹ˆκΉŒ?
11:13:11 web.1 | 127.0.0.1 - - [15/Sep/2016 11:13:11] "GET /api/method/frappe.utils.print_format.download_pdf?doctype=Purchase%20Order&name=PO-00001&format=PO&no_letterhead=0 HTTP/1.1" 200 - 11:13:11 web.1 | Error on request: 11:13:11 web.1 | Traceback (most recent call last): 11:13:11 web.1 | File "/home/ommi/frappe-bench/env/lib/python2.7/site-packages/werkzeug/serving.py", line 193, in run_wsgi 11:13:11 web.1 | execute(self.server.app) 11:13:11 web.1 | File "/home/ommi/frappe-bench/env/lib/python2.7/site-packages/werkzeug/serving.py", line 184, in execute 11:13:11 web.1 | write(data) 11:13:11 web.1 | File "/home/ommi/frappe-bench/env/lib/python2.7/site-packages/werkzeug/serving.py", line 152, in write 11:13:11 web.1 | self.send_header(key, value) 11:13:11 web.1 | File "/usr/lib/python2.7/BaseHTTPServer.py", line 401, in send_header 11:13:11 web.1 | self.wfile.write("%s: %s\r\n" % (keyword, value)) 11:13:11 web.1 | IOError: [Errno 32] Broken pipe

λ„μ™€μ£Όμ„Έμš”

RagavλŠ” werkzeug의 λ‚΄μž₯ dev λŒ€μ‹  λ‹€λ₯Έ μ‘μš© ν”„λ‘œκ·Έλž¨ μ„œλ²„λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
gunicornκ³Ό 같은 μ„œλ²„. ν˜„μž¬λ‘œμ„œλŠ” μœ μΌν•œ ν•΄κ²°μ±…μž…λ‹ˆλ‹€.

2016-09-15 8:07 GMT+02:00 Ragav μ•Œλ¦Ό @github.com:

μ•ˆλ…•ν•˜μ„Έμš”, μ €λŠ” NGINX λ’€μ—μ„œ μ‹€ν–‰λ˜λŠ” Werkzeug 개발 μ„œλ²„λ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
같은 문제둜 λˆ„κ΅¬λ“ μ§€ λ‚˜λ₯Ό λ„μšΈ 수 μžˆμŠ΅λ‹ˆλ‹€. ```
11:13:11 web.1 | 127.0.0.1 - - [15/9/2016 11:13:11] "GET
/api/method/frappe.utils.print_format.download_pdf?
doctype=ꡬ맀%20μ£Όλ¬Έ&이름=PO-00001&ν˜•μ‹=PO&no_letterhead=0
HTTP/1.1" 200 -
11:13:11 web.1 | μš”μ²­ μ‹œ 였λ₯˜:
11:13:11 web.1 | 역좔적(κ°€μž₯ 졜근 호좜 λ§ˆμ§€λ§‰):
11:13:11 web.1 | 파일 "/home/ommi/frappe-bench/env/
lib/python2.7/site-packages/werkzeug/serving.py", 193ν–‰, run_wsgi
11:13:11 web.1 | μ‹€ν–‰(self.server.app)
11:13:11 web.1 | 파일 "/home/ommi/frappe-bench/env/
lib/python2.7/site-packages/werkzeug/serving.py", 184ν–‰, μ‹€ν–‰ 쀑
11:13:11 web.1 | μ“°κΈ°(데이터)
11:13:11 web.1 | 파일 "/home/ommi/frappe-bench/env/
lib/python2.7/site-packages/werkzeug/serving.py", 152ν–‰, μž‘μ„± 쀑
11:13:11 web.1 | self.send_header(ν‚€, κ°’)
11:13:11 web.1 | 파일 "/usr/lib/python2.7/BaseHTTPServer.py", 401ν–‰,
send_headerμ—μ„œ
11:13:11 web.1 | self.wfile.write("%s: %s\r\n" % (ν‚€μ›Œλ“œ, κ°’))
11:13:11 web.1 | IOError: [Errno 32] 깨진 νŒŒμ΄ν”„

λ„μ™€μ£Όμ„Έμš”

β€”
당신이 μ–ΈκΈ‰λ˜μ—ˆκΈ° λ•Œλ¬Έμ— 이것을 λ°›λŠ” κ²ƒμž…λ‹ˆλ‹€.
이 이메일에 직접 λ‹΅μž₯ν•˜κ³  GitHubμ—μ„œ ν™•μΈν•˜μ„Έμš”.
https://github.com/pallets/werkzeug/issues/954#issuecomment -247243400,
λ˜λŠ” μŠ€λ ˆλ“œ μŒμ†Œκ±°
https://github.com/notifications/unsubscribe-auth/AA6MZ6DNiRIfL91CLeYOoA70W9_nQQzGks5qqOCMgaJpZM4I58cy
.

졜근 μˆ˜μ • 컀밋에 따라 passthrough_errors=False둜 app.run을 ν˜ΈμΆœν•˜μ—¬ 이 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. YMMV

μΆ©λŒμ„ μΌμœΌν‚¨ λ²„κ·ΈλŠ” 2016λ…„ 12μ›” 21일에 릴리슀 된 버전 0.12μ—μ„œ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€ .

  • λ‚΄λΆ€ μ„œλ²„ 였λ₯˜(ν’€ μš”μ²­ #2006)λ₯Ό λ°˜ν™˜ν•˜λŠ” λŒ€μ‹  개발 μ„œλ²„ μΆ©λŒμ„ μΌμœΌν‚€λŠ” λ™μž‘ 변경을 λ˜λŒλ¦½λ‹ˆλ‹€.

버전 0.12λŠ” μ§€λ‚œ μ£Όμ—λ§Œ μΆœμ‹œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

2017λ…„ 3μ›” 20일 μ›”μš”μΌ 09:05:00AM -0700μ—μ„œ Alan Rotman은 λ‹€μŒκ³Ό 같이 μΌμŠ΅λ‹ˆλ‹€.

μΆ©λŒμ„ μΌμœΌν‚¨ λ²„κ·ΈλŠ” 2016λ…„ 12μ›” 21일에 릴리슀 된 버전 0.12μ—μ„œ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€ .

  • λ‚΄λΆ€ μ„œλ²„ 였λ₯˜(ν’€ μš”μ²­ #2006)λ₯Ό λ°˜ν™˜ν•˜λŠ” λŒ€μ‹  개발 μ„œλ²„ μΆ©λŒμ„ μΌμœΌν‚€λŠ” λ™μž‘ 변경을 λ˜λŒλ¦½λ‹ˆλ‹€.

--
μ—΄κΈ°/λ‹«κΈ° μƒνƒœλ₯Ό μˆ˜μ •ν–ˆκΈ° λ•Œλ¬Έμ— 이 λ©”μ‹œμ§€κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.
이 이메일에 직접 λ‹΅μž₯ν•˜κ±°λ‚˜ GitHubμ—μ„œ ν™•μΈν•˜μ„Έμš”.
https://github.com/pallets/werkzeug/issues/954#issuecomment -287807602

였늘 방금 ReleaseNotesλ₯Ό λ³΄μ•˜κ³  이 μˆ˜μ • 사항을 μ˜€λž«λ™μ•ˆ κΈ°λ‹€λ € μ™”μŠ΅λ‹ˆλ‹€.

μ°Έμ‘° :
버전 0.12
2016λ…„ 12μ›” 21일 μΆœμ‹œ, μ½”λ“œλͺ… Punch.

https://pypi.python.org/pypi/Flask/0.12
크기에 μ—…λ‘œλ“œλœ 파일 ν˜•μ‹ Py 버전
Flask-0.12-py2.py3-none-any.whl (md5) 파이썬 휠 2.7 2016-12-21 80KB
Flask-0.12.tar.gz(md5) μ†ŒμŠ€ 2016-12-21 519KB

μ•„, λ„€, ν”ŒλΌμŠ€ν¬λ₯Ό λ§μ”€ν•˜μ‹œλŠ”κ΅°μš”. ν™•μ‹ ν•˜λŠ”.

2017λ…„ 3μ›” 20일 μ›”μš”μΌ 09:22:15AM -0700μ—μ„œ Alan Rotman은 λ‹€μŒκ³Ό 같이 μΌμŠ΅λ‹ˆλ‹€.

였늘 방금 ReleaseNotesλ₯Ό λ³΄μ•˜κ³  이 μˆ˜μ • 사항을 μ˜€λž«λ™μ•ˆ κΈ°λ‹€λ € μ™”μŠ΅λ‹ˆλ‹€.

μ°Έμ‘° :
버전 0.12
2016λ…„ 12μ›” 21일 μΆœμ‹œ, μ½”λ“œλͺ… Punch.

https://pypi.python.org/pypi/Flask/0.12
크기에 μ—…λ‘œλ“œλœ 파일 ν˜•μ‹ Py 버전
Flask-0.12-py2.py3-none-any.whl (md5) 파이썬 휠 2.7 2016-12-21 80KB
Flask-0.12.tar.gz(md5) μ†ŒμŠ€ 2016-12-21 519KB

--
μ—΄κΈ°/λ‹«κΈ° μƒνƒœλ₯Ό μˆ˜μ •ν–ˆκΈ° λ•Œλ¬Έμ— 이 λ©”μ‹œμ§€κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.
이 이메일에 직접 λ‹΅μž₯ν•˜κ±°λ‚˜ GitHubμ—μ„œ ν™•μΈν•˜μ„Έμš”.
https://github.com/pallets/werkzeug/issues/954#issuecomment -287813405

threaded=True λͺ¨λ“œμ˜ werkzeugμ—μ„œ flask 0.12.2λ₯Ό μ‹€ν–‰ν•  λ•Œ 이 문제λ₯Ό κ²ͺκ³  μžˆλŠ” μ‚¬λžŒμ„ μœ„ν•œ μ°Έκ³  사항:
μŠ€λ ˆλ“œ λͺ¨λ“œμ—μ„œ 기본적으둜 각 werkzeug μŠ€λ ˆλ“œμ—λŠ” μ‹€μ œλ‘œ μ—¬μ „νžˆ 이 λ¬Έμ œκ°€ μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. 즉, λ°˜ν™˜ν•˜λŠ” 데 μ‹œκ°„μ΄ κ±Έλ¦¬λŠ” 경둜λ₯Ό μš”μ²­ν•œ λ‹€μŒ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ 연결을 λ‹«μœΌλ©΄ νŠΉμ • werkzeugκ°€ IOError Broken Pipeλ₯Ό κΈ°λ‘ν•œ λ‹€μŒ μ£½λŠ”λ‹€. λ‚΄ μ‘μš© ν”„λ‘œκ·Έλž¨μ—μ„œ 이것이 μ–΄λ–»κ²Œλ“  λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό μΌμœΌν‚€κ³  μžˆλ‹€λŠ” 것을 λ°œκ²¬ν–ˆλ‹€λŠ” 점을 μ œμ™Έν•˜κ³  μ„œλ²„ μ „μ²΄λŠ” 계속 μž‘λ™ν•©λ‹ˆλ‹€. λͺ¨λ“  μŠ€λ ˆλ“œμ—μ„œ νŒŒμ΄ν”„κ°€ λŠμ–΄μ§„ ν›„ ν”ŒλΌμŠ€ν¬ ν”„λ‘œμ„ΈμŠ€κ°€ 천천히 μ„±μž₯ν•˜κ³  λͺ¨λ“  RAM을 μ‚¬μš©ν•œ λ‹€μŒ SWAP을 μ‚¬μš©ν•œ λ‹€μŒ λ§ˆμ§€λ§‰μœΌλ‘œ OS에 μ˜ν•΄ 사망.
app.runμ—μ„œ passthrough_errors=Falseλ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ „μ†‘ν•˜λ©΄ λ¬Έμ œκ°€ ν•΄κ²°λœ 것 κ°™μŠ΅λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈ 연결이 끊길 λ•Œ μŠ€λ ˆλ“œκ°€ 더 이상 죽지 μ•Šκ³  μ •μƒμ μœΌλ‘œ IOErrorλ₯Ό κΈ°λ‘ν•˜κ³  λ‹€μŒλ„ κΈ°λ‘ν•©λ‹ˆλ‹€(passthrough_errors=Falseλ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ„€μ •ν•˜μ§€ μ•Šκ³ λŠ” λ³Έ 적이 μ—†μŒ).

Exception happened during processing of request from ('127.0.0.1', 50652)
----------------------------------------

그런 λ‹€μŒ μ„œλ²„λŠ” 계속 μ •μƒμ μœΌλ‘œ μ‹€ν–‰λ©λ‹ˆλ‹€. λ©”λͺ¨λ¦¬ λˆ„μˆ˜κ°€ λ‹€μ‹œ λ‚˜νƒ€λ‚˜λŠ”μ§€ ν™•μΈν•˜λ €λ©΄ 아직 λͺ‡ μ‹œκ°„μ„ κΈ°λ‹€λ €μ•Ό ν•˜μ§€λ§Œ 그렇지 μ•ŠκΈ°λ₯Ό λ°”λžλ‹ˆλ‹€.

λˆ„κ΅°κ°€μ—κ²Œ 도움이 될 경우λ₯Ό λŒ€λΉ„ν•˜μ—¬.

Ubuntu VM의 Kubernetes에 μžˆλŠ” Ubuntu Docker μ»¨ν…Œμ΄λ„ˆμ—μ„œλ„ 이 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

Error on request:
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/werkzeug/serving.py", line 270, in run_wsgi
    execute(self.server.app)
  File "/usr/local/lib/python2.7/dist-packages/werkzeug/serving.py", line 261, in execute
    write(data)
  File "/usr/local/lib/python2.7/dist-packages/werkzeug/serving.py", line 227, in write
    self.send_header(key, value)
  File "/usr/lib/python2.7/BaseHTTPServer.py", line 412, in send_header
    self.wfile.write("%s: %s\r\n" % (keyword, value))
IOError: [Errno 32] Broken pipe

μƒˆλ‘œμš΄ Ubuntu xenial VM을 λ§Œλ“€κ³  Kubernetes의 Ubuntu Docker μ»¨ν…Œμ΄λ„ˆμ—μ„œ λ™μΌν•œ μ½”λ“œλ₯Ό μ‹€ν–‰ν–ˆλŠ”λ° 이 였λ₯˜κ°€ ν‘œμ‹œλ˜μ§€ μ•Šκ³  Python Flaskκ°€ μ˜ˆμƒλŒ€λ‘œ μž‘λ™ν–ˆμŠ΅λ‹ˆλ‹€. λ‚΄ 호슀트(Ubuntu VM)에 λ¬Έμ œκ°€ μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

@vhosakot μ•± ꡬ성을 μ–΄λ–»κ²Œ μ„€μ •ν–ˆλŠ”μ§€ μ•Œλ €

경둜 κΈ°λŠ₯μ—μ„œ 경둜 지정을 μœ„ν•œ λ‹€λ₯Έ κΈ°λŠ₯을 μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.
ν•΄λ‹Ή ν•¨μˆ˜μ˜ μ‘λ‹΅μ—μ„œ 데이터λ₯Ό κ°€μ Έμ™”μŠ΅λ‹ˆλ‹€.
이제 ν•΄λ‹Ή 데이터에 _loads()_λ₯Ό μ‚¬μš©ν•˜λ©΄ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

...
response = get_contents().data
        if response:
            data = loads(response)
..

였λ₯˜: IOError: [Errno 32] Broken pipe

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰