рдЕрдЧрд░ рдХреЛрдИ рдФрд░ рд╕реНрд╡рдпрдВрд╕реЗрд╡рдХ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭрд╕реЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрдЫреЗрдВ :)
рд╡рд╣реА рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдЖрдпрд╛ рдерд╛ред рдореИрдВ рддреИрдпрд╛рд░ рд╣реВрдВ рд▓реЗрдХрд┐рди рд╕реА рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рд╛рде рд╕рдЪрдореБрдЪ рд╢реВрдиреНрдп рдЕрдиреБрднрд╡ рд╣реИред рдЕрдЧрд░ рдореИрдВ рдХреЛрдИ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВред рдпрджрд┐ рдЖрдк рдореБрдЭреЗ 2 рд╕реЗ 3 рддрдХ рдкреЛрд░реНрдЯрд┐рдВрдЧ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рдЕрдЪреНрдЫреЗ рдЯреВрд▓ рдпрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдореИрдВ рдЙрд╕ рдкрд░ рдбрд╛рд▓реВрдВрдЧрд╛ рдФрд░ рдЕрдкрдиреА рдХрд┐рд╕реНрдордд рдЖрдЬрдорд╛рдКрдВрдЧрд╛ред
рдмрд╣реБрдд рдХрдард┐рди рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЪреВрдВрдХрд┐ PyString_foo
Py3 рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдореЗрдВ рдореВрд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ (WSGI dict key/values) рдХреЗ рд▓рд┐рдП рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп Py2-to-Py3 рдкреЛрд░реНрдЯрд┐рдВрдЧ рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП http://rhodesmill.org/brandon/2008/porting-ac-extension-module-to-python-30/ рднреА рджреЗрдЦреЗрдВред
рдпрджрд┐ рдЖрдкрдХреЗ рдХреЛрдИ рдкреНрд░рд╢реНрди рд╣реИрдВ рддреЛ рдмреЗрдЭрд┐рдЭрдХ рдИ-рдореЗрд▓ рд▓рд┐рдЦреЗрдВ :)
рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ рдкреАрдИрдкреА 333 рд╕реЗ рдкреАрдИрдкреА 3333 рдЕрдВрддрд░ рд╣реИ: http://paste.pocoo.org/show/320496/
рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдЕрдкрдиреЗ рдЖрдк рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░ рдкрд╛рдКрдВрдЧрд╛ред рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдХреБрдЫ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдорджрджрдЧрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдмрд╕ рд╕реА рдирд╣реАрдВ рдЬрд╛рдирддрд╛ред
рдореЗрд░реЗ рдХрд╛рдВрдЯреЗ рдХреЗ рд╡рд░реНрддрдорд╛рди рд░рд╛рдЬреНрдп рдХреЛрдб рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕рдВрдХрд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ vPy2 рдЕрдкреНрд░рднрд╛рд╡рд┐рдд (рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛) рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИ рдФрд░ vPy3 рдХреЛ рдХрдо рд╕реЗ рдХрдо рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдмреИрдХрдЯреНрд░реЗрд╕ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдкрд╣рд▓рд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдкрд░ рдореБрдЭреЗ рдПрдХ segfault рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред
http://docs.python.org/py3k/howto/cporting.html рдЗрд╕рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ:
PyInt_FromLong
рд╕реЗ PyLong_FromLong
рддрдХ request.c
$ рдореЗрдВ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рджреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкрдВрдХреНрддрд┐ рд╣реИред
рдЗрди рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ PyString
рдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдг рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред
http://docs.python.org/py3k/c-api/module.html рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ cStringIO
рдореЗрдВ request.c
рдХреЛ рдорд╛рдирдХ PyBytes
рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдореИрдВрдиреЗ рдПрдХ cString рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕реНрдерд╛рди рдкрд░ memcpy
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдФрд░ рдмрд╕ рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ wsgi.input
рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИред PycString_IMPORT
рдкрд░ рдХреЙрд▓ рдХреЛ рдмрд┐рдирд╛ рдмрджрд▓реЗ рд╣реА рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдореЙрдбреНрдпреВрд▓ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди: рд╡рд╛рд╣ рдЬреЛ рдмрджрд╕реВрд░рдд рд╣реИ :-( рд╡реЗ рдХрдо рд╕реЗ рдХрдо рд╣рдорд╕реЗ рд╕рдЪреНрдЪрд╛рдИ рдЫреБрдкрд╛рддреЗ рд╣реБрдП рдПрдХ рд░реВрдЯреАрди рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рдереЗ :-(
рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕: рдЖрдкрдХреЛ Py3 рдореЗрдВ рд╣реЗрдбрд░ рдЖрдЗрдЯрдо рдХреЗ рд▓рд┐рдП PyUnicode
рдФрд░ Py2 рдореЗрдВ PyString
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ Py3 рдореЗрдВ PyBytes
рдХрд╛ред рдХреНрдпрд╛ рдЖрдкрдиреЗ рдкреАрдИрдкреА 3333 рдЕрдВрддрд░ рдкрдврд╝рд╛?
cStringIO: рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ cStringIO рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░рддрд╛ рд╣реВрдВ (рдХреНрдпреЛрдВрдХрд┐ рд╕рд╛рдордЧреНрд░реА рдХреА рд▓рдВрдмрд╛рдИ рдЬреНрдЮрд╛рдд рд╣реИ рдЗрд╕рд▓рд┐рдП рдПрдХ рд╕реНрдерд┐рд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред рд▓реЗрдХрд┐рди WSGI рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ cStringIO рдХреЛ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреА рддрд░рд╣ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдпрд╛ рддреЛ рд╣рдо Py3 cStringIO рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди (рдЬреЛ рдХреБрдЫ рднреА рд╣реИ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдпрд╛ рд╣рдо рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд░реИрдкрд░ рд░реЛрд▓ рдЖрдЙрдЯ рдХрд░реЗрдВ (рдореИрдВ рдРрд╕рд╛ рдХрд░ рд╕рдХрддрд╛ рдерд╛)ред
рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ рд╕реЗрдЧрдлреЙрд▓реНрдЯ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкрд╛рд░рд┐рдд рддрд░реНрдХ рдХреЗрд╡рд▓ рдПрдХ рдкреВрд░реНрдг рд╕реВрдЪрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рдЕрдиреБрд░реЛрдз рдирд┐рдХрд╛рдп рдирд╣реАрдВ рд╣реИред
рдореЙрдбреНрдпреВрд▓ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди: рд╡рд╛рд╣ рдЬреЛ рдмрджрд╕реВрд░рдд рд╣реИ :-( рд╡реЗ рдХрдо рд╕реЗ рдХрдо рд╣рдорд╕реЗ рд╕рдЪреНрдЪрд╛рдИ рдЫреБрдкрд╛рддреЗ рд╣реБрдП рдПрдХ рд░реВрдЯреАрди рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рдереЗ :-(
рд╣рд╛рдБ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ <1KLOC рдХреА рднреА рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдмрд╣реБрдд рд╣рдЯрд╛ рджрд┐рдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рд▓рдЧрднрдЧ рдЙрддрдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред
рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕: рдЖрдкрдХреЛ Py3 рдореЗрдВ рд╣реЗрдбрд░ рдЖрдЗрдЯрдореНрд╕ рдХреЗ рд▓рд┐рдП PyUnicode рдФрд░ Py2 рдореЗрдВ PyString рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, Py3 рдореЗрдВ PyBytes рдХрд╛ рдирд╣реАрдВред рдХреНрдпрд╛ рдЖрдкрдиреЗ рдкреАрдИрдкреА 3333 рдЕрдВрддрд░ рдкрдврд╝рд╛?
рд╣рд╛рдБ, рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЕрдВрддрд░ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдФрд░ рдкреАрд▓реЗ рд░рдВрдЧ рдореЗрдВ рдЦреЛ рдЧрдпрд╛, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд▓рдЧрднрдЧ рд╕рднреА рдмрд╛рдЗрдЯрд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рддреБрдо рд╕рд╣реА рдХрд╣ рд░рд╣реА рд╣реЛред рдореИрдВрдиреЗ рдЕрднреА рд╕рднреА рдЙрдкрдпреБрдХреНрдд рдХреЛрдб рдХреЛ PyBytes рдФрд░ PyUnicode рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ рдФрд░ define
d рдЙрдиреНрд╣реЗрдВ Py2x рдХреЗ рд▓рд┐рдП PyString рдореЗрдВ рдЙрд▓рдЯ рджрд┐рдпрд╛ рд╣реИред рдХреНрдпрд╛ environ
рдФрд░/рдпрд╛ рд╢реАрд░реНрд╖рд▓реЗрдЦреЛрдВ рдХреЛ рдЗрд╕ рддрд░рд╣ рдХреБрдЫ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? PyUnicode_FromString
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп $ HTTP/1.1 400 Bad Request
рдЯреЗрд▓рдиреЗрдЯ рдХрдЪрд░рд╛ рдереВрдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди PyBytes_FromString
рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ..
Google рдорд╛рдореВрд▓реА рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рд╕рдВрджрд░реНрднрд┐рдд cStringIO рдФрд░ Python3 рдХреЛ рдЦреЛрдЬрдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рд╣реИ ред рдореИрдВрдиреЗ рдЕрднреА рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рд╣реИ
рд╡рд╣ рдЧрд▓рдд рд╕реЗрдЧрдлреЙрд▓реНрдЯ рдерд╛, рдХреНрд╖рдорд╛ рдХрд░реЗрдВред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрдо рд╕реЗ рдХрдо рдЙрд╕рдХреЗ рд╕реНрд░реЛрдд рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд▓рд┐рдпрд╛ рдерд╛ред рдпрд╣ wsgi_app
рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдПрдХ рд░рдирдиреЗрдмрд▓ рд╕рд░реНрд╡рд░ рдХреЗ рдХрд░реАрдм рд╣реВрдВред рдЕрдЧрд░ рдореИрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдореБрджреНрджреЛрдВ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рджреЗрд╢реА рд╕реНрдЯреНрд░рд┐рдВрдЧ/рдпреВрдирд┐рдХреЛрдб рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЪреАрдЬрд╝ рдХреЛ рдереЛрдбрд╝рд╛ рдЦрд░рд╛рдм рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рдХреБрдЫ рдпреБрдХреНрддрд┐рдпрд╛рдВ рджреА рдЧрдИ рд╣реИрдВ:
рджреЛ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, py2.h
рдФрд░ py3.h
, # рд╕рднреА _used_ PyStr_*
рд░реВрдЯреАрди рдХреЛ Python рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдореВрд▓ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ ( str
, = PyString
Py2 рдкрд░ рдФрд░ PyUnicode
Py3 рдкрд░)ред рдлрд┐рд░ Py2 рдкрд░ PyBytes_*
рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ PyString
рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ (рдХреНрдпреЛрдВрдХрд┐ Py2 рдХрд╛ str
Py3 рдХрд╛ bytes
рд╣реИ)ред PyUnicode
рдХрд╛ рдЙрдкрдпреЛрдЧ Python 2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ PEP 3333 рдЬреЛрд░ рджреЗрддрд╛ рд╣реИред
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣рдореЗрд╢рд╛ PyBytes
рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП: рдкрд╛рдпрдерди 2 рдкрд░, рдЖрдкрдХреЛ рдХреЛрдИ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ PyString
рдмрд╛рдЗрдЯреНрд╕ рд╣реИ рдЬрдмрдХрд┐ рдкрд╛рдпрдерди 3 рдкрд░ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ WSGI рдПрдкреНрд▓рд┐рдХреЗрд╢рди PyUnicode
рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ
рдЖрдкрдХрд╛ рд╕реЗрдЧрдлреЙрд▓реНрдЯ рдмрд╣реБрдд рдЕрдЬреАрдм рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдХрд╣реАрдВ рдФрд░ рдЧрдбрд╝рдмрдбрд╝реА рдХреА рд╣реИ ... рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВ рд╣рд░ рдХреЛрдИ рдХрд░рддрд╛ рд╣реИ :)
рд╡рд░реНрддрдорд╛рди cStringIO рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди ( memcpy
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдЯреВрдЯ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ on_body
рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдкрд╣рд▓реЗ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реИред рдЖрдкрдХреЛ memcpy
рдПрдб рдбреЗрдЯрд╛ рдХреА рдХреБрд▓ рд░рд╛рд╢рд┐ рдХрд╛ рдЯреНрд░реИрдХ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ ( bjparser
рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВ)ред body = FromString(body)
(рдкрдВрдХреНрддрд┐ 203) рдХреЛ рднреА рд╣рдЯрд╛ рджреЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИ рдФрд░ рдкреВрд░реА рдмреЙрдбреА рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИред
рдЖрдкрдХреЗ рдкреНрд░рдпрд╛рд╕ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд - рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж!
рдЕрд░реЗ рдПрдВрдЬреЗрд▓реЛ, Py3 рд╕рдорд░реНрдерди рдкрд░ рдХреЛрдИ рдЦрдмрд░?
рдЧреБрдирдЧреБрдирд╛рд╣рдЯ! рдЗрд╕реЗ рдЬрд▓реНрдж рд╣реА рдХрд┐рд╕реА рднреА рд╕рдордп рдкреБрдирд░реНрдЬреАрд╡рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рд╣реИ? рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдореИрдВ рдЙрд╕ рдкрд░ рд╡рд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред
рдирд╣реАрдВ, рдХреЛрдИ рдпреЛрдЬрдирд╛ рдирд╣реАрдВред рдХрд┐рд╕реА рдФрд░ рдХреЗ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдмрдВрджрд░рдЧрд╛рд╣ рд╣реИ https://github.com/isaiah/bjoern-py3 рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдХрднреА рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреЛрдб (рдмрд╛рдЗрдЯреНрд╕рд┐рдпреЛ рдСрдмреНрдЬреЗрдХреНрдЯ) рдЬреЛрдбрд╝рддрд╛ рд╣реИред
рдПрдХ рдкреБрд░рд╛рдиреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдкреБрдирд░реБрджреНрдзрд╛рд░ рдЖрдкрдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ bjoern рдЕрднреА рднреА SO_REUSEPORT рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд╛рд▓рд╛ рдПрдХрдорд╛рддреНрд░ WSGI рд╕рд░реНрд╡рд░ рд╣реИред рдмрд╣реБрдд рдмреБрд░рд╛ рд╣рдо рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред
рдХреНрдпрд╛ рдЖрдкрдХреЛ рдпрдХреАрди рд╣реИ? рдпрд╣ рдПрдХ рдорд╛рдирдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рд░реНрд╡рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
рдЗрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд╕рд░реНрд╡рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рдЦреЛрд▓реЗ рдЧрдП рд╕реЙрдХреЗрдЯ рдХреЛ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдЗрддрдирд╛ рдЬрдЯрд┐рд▓ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдХрд░ рднреА рдкрдЫрддрд╛рдПрдВрдЧреЗред
рдирд┐рд╖реНрдкрдХреНрд╖ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдпреВрдбрдмреНрд▓реНрдпреВрдПрд╕рдЬреАрдЖрдИ рд╢рд╛рдпрдж рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджрд╕реНрддрд╛рд╡реЗрдЬ рдореБрдЭреЗ рдорд╛рд░ рд░рд╣рд╛ рд╣реИред
рдореБрдЭреЗ рдпрд╣ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрд╣реБрдд рджреЗрд░ рд╕реЗ рдорд┐рд▓рд╛ :-( рдЗрд╕ рд╕рдордп рдореИрдВ рд╣рд▓реНрдХреЗ рдкрд╛рдпрдерди рд╡реЗрдм-рд╕рд░реНрд╡рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдкрдирд╛ рджреЗрдЦ рд░рд╣рд╛ рдерд╛, рдмрд┐рдирд╛ nginx рдХреЗ рдЖрд╕рдкрд╛рд╕ рдиреГрддреНрдп рдХрд┐рдПред рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ Python3 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рд╣реИ?
рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ CPython C API рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЕрдиреБрднрд╡ рд╣реИ (рдпрд╛ рдЗрд╕реЗ рд╕реАрдЦрдиреЗ рдХреЗ рдЗрдЪреНрдЫреБрдХ рд╣реИрдВ) рддреЛ рдмреЗрдЭрд┐рдЭрдХ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ!
рд░реБрдХреЛ, рдмреНрдпреЛрд░реНрди 2017 рдореЗрдВ рдкрд╛рдпрдерди 3 рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдореБрджреНрджрд╛ рдЕрднреА рднреА рдЦреБрд▓рд╛ рд╣реИ? рдмрд╣реБрдд рдЦреВрдмред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ :(
@jonashaag рдореИрдВрдиреЗ рдЙрдард╛рдпрд╛ рдФрд░ рдЗрд╕реЗ python3 рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ ... рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рд▓рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рд╛рдл рд╣реИ рд▓реЗрдХрд┐рди рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ/рд╕реБрдЭрд╛рд╡реЛрдВ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред :-)
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
@jonashaag рдореИрдВрдиреЗ рдЙрдард╛рдпрд╛ рдФрд░ рдЗрд╕реЗ python3 рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ ... рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рд▓рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рд╛рдл рд╣реИ рд▓реЗрдХрд┐рди рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ/рд╕реБрдЭрд╛рд╡реЛрдВ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред :-)
https://github.com/jonashaag/bjoern/pull/104