Bjoern: рдкрд╛рдпрдерди 3 рд╕рдорд░реНрдерди (рдкреАрдИрдкреА 3333)

рдХреЛ рдирд┐рд░реНрдорд┐рдд 13 рдЬрдире░ 2011  ┬╖  18рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: jonashaag/bjoern

рдЕрдЧрд░ рдХреЛрдИ рдФрд░ рд╕реНрд╡рдпрдВрд╕реЗрд╡рдХ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭрд╕реЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрдЫреЗрдВ :)

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

@jonashaag рдореИрдВрдиреЗ рдЙрдард╛рдпрд╛ рдФрд░ рдЗрд╕реЗ python3 рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ ... рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рд▓рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рд╛рдл рд╣реИ рд▓реЗрдХрд┐рди рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ/рд╕реБрдЭрд╛рд╡реЛрдВ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред :-)

https://github.com/jonashaag/bjoern/pull/104

рд╕рднреА 18 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╡рд╣реА рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдЖрдпрд╛ рдерд╛ред рдореИрдВ рддреИрдпрд╛рд░ рд╣реВрдВ рд▓реЗрдХрд┐рди рд╕реА рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рд╛рде рд╕рдЪрдореБрдЪ рд╢реВрдиреНрдп рдЕрдиреБрднрд╡ рд╣реИред рдЕрдЧрд░ рдореИрдВ рдХреЛрдИ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВред рдпрджрд┐ рдЖрдк рдореБрдЭреЗ 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 рдкрджрд╛рд╡рдирдд рд╣реИ

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ 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 рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ ... рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рд▓рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рд╛рдл рд╣реИ рд▓реЗрдХрд┐рди рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ/рд╕реБрдЭрд╛рд╡реЛрдВ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред :-)

https://github.com/jonashaag/bjoern/pull/104

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕