Werkzeug: рдХреНрдпрд╛ Werkzeug рдХреЗ рдкрд╛рд╕ ASGI рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 7 рдЬреВрди 2018  ┬╖  21рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: pallets/werkzeug

Werkzeug рдХрдИ рдЙрдкрдпреЛрдЧреА рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЕрдЧрд░ рдпрд╣ ASGI рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдЦрд░реЛрдВрдЪ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

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

рд╣рд╛рдБ, Werkzeug рдФрд░ Flask рдЕрдВрддрддрдГ ASGI рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВрдЧреЗред рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдордпрд░реЗрдЦрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдЧрд░ рдХрд┐рд╕реА рдиреЗ рдкреАрдЖрд░ рд╢реБрд░реВ рдХрд┐рдпрд╛ рд╣реИ рддреЛ рдореБрдЭреЗ рдкреАрдЖрд░ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рд╡рд╣ рдирд╣реАрдВ рдмрдирдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ рд╕рдореБрджрд╛рдп рд╕реЗ рдорджрдж рдЪрд╛рд╣рд┐рдПред рдирд╡реАрдирддрдо рдЕрдкрдбреЗрдЯ рдиреАрдЪреЗ рджреЗрдЦреЗрдВ: https://github.com/pallets/werkzeug/issues/1322#issuecomment -600926145

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

рд╣рд╛рдБ, Werkzeug рдФрд░ Flask рдЕрдВрддрддрдГ ASGI рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВрдЧреЗред рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдордпрд░реЗрдЦрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдЧрд░ рдХрд┐рд╕реА рдиреЗ рдкреАрдЖрд░ рд╢реБрд░реВ рдХрд┐рдпрд╛ рд╣реИ рддреЛ рдореБрдЭреЗ рдкреАрдЖрд░ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рд╡рд╣ рдирд╣реАрдВ рдмрдирдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ рд╕рдореБрджрд╛рдп рд╕реЗ рдорджрдж рдЪрд╛рд╣рд┐рдПред рдирд╡реАрдирддрдо рдЕрдкрдбреЗрдЯ рдиреАрдЪреЗ рджреЗрдЦреЗрдВ: https://github.com/pallets/werkzeug/issues/1322#issuecomment -600926145

рдореБрдЭреЗ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рд╣реИрдХреА рдПрдПрд╕рдЬреАрдЖрдИ рд╕рдорд░реНрдерди рдЪрд▓ рд░рд╣рд╛ рд╣реИ: werkzeug , рдлреНрд▓рд╛рд╕реНрдХ ред рдЖрдЧреЗ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореИрдВ рдЖрдкрдХреА рдХрд┐рд╕реА рднреА рдпреЛрдЬрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдЪреАрдЬреЗрдВ рдЬреЛ рдореЗрд░реЗ рд╕рд╛рде рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реЛрддреА рд╣реИрдВ, рдЗрд╕ рддрдереНрдп рд╕реЗ рдкрд░реЗ рдХрд┐ рдореИрдВрдиреЗ рдЬреЛ рдХреБрдЫ рднреА рдХрд┐рдпрд╛ рд╣реИ рд╡рд╣ рдЖрдо рддреМрд░ рдкрд░ рдЕрдЪреНрдЫрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

  • рдореИрдВ рдХреЗрд╡рд▓ рдПрдХ рдереНрд░реЗрдб рдореЗрдВ рдЕрдкрдирд╛ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдб рдЪрд▓рд╛рдХрд░ рдлреЙрд░реНрдо рдкрд╛рд░реНрд╕рд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рдЬрд┐рд╕реЗ рдореИрдВ рдбреЗрдЯрд╛ рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдкрдврд╝рддреЗ рд╕рдордп рдмреНрд▓реЙрдХ рдХрд░рддрд╛ рд╣реВрдВ)ред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдпреЗ рдЪрд▓реЗрдЧрд╛. рдореЗрд░рд╛ рдкрд╕рдВрджреАрджрд╛ рддрд░реАрдХрд╛ IO рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛ ред
  • рдкреНрд░рд╕рдВрдЧ-рд╕реНрдерд╛рдиреАрдп рд╕рдорд░реНрдерди рдмрд╣реБрдд рдирд╛рдЬреБрдХ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рд╣реА рддрд░реАрдХрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдПрд╕рдЬреАрдЖрдИ рдХреЗ рд╕рд╛рде рд╣рдо рдпрд╣ рдирд╣реАрдВ рдорд╛рди рд╕рдХрддреЗ рдХрд┐ рд╣рдо рджреБрдирд┐рдпрд╛ рдХреЗ рдорд╛рд▓рд┐рдХ рд╣реИрдВред
  • рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рдЬрдм ASGI рдХреЗ рддрд╣рдд рдЪрд▓ рд░рд╣рд╛ рд╣реЛ, рдПрдХ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдСрди-рдбрд┐рдорд╛рдВрдб рдлреЙрд░реНрдо рдбреЗрдЯрд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдлреЙрд░реНрдо рдбреЗрдЯрд╛ рдХреЛ рдЙрддреНрд╕реБрдХрддрд╛ рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдпрд╣ рдирд╣реАрдВ рдмрддрд╛ рд╕рдХреЗрдВ рдХрд┐ рд╡реНрдпреВ рдлрд╝рдВрдХреНрд╢рди рдПрд╕рд┐рдВрдХ рд╣реИред рдЬреЛ рдХреБрдЫ рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИ, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдЬрд╛рдирдиреЗ рджреЗрдВред

рдореИрдВ рдХреЗрд╡рд▓ рдПрдХ рдереНрд░реЗрдб рдореЗрдВ рдЕрдкрдирд╛ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдб рдЪрд▓рд╛рдХрд░ рдлреЙрд░реНрдо рдкрд╛рд░реНрд╕рд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рдЬрд┐рд╕реЗ рдореИрдВ рдбреЗрдЯрд╛ рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдкрдврд╝рддреЗ рд╕рдордп рдмреНрд▓реЙрдХ рдХрд░рддрд╛ рд╣реВрдВ)ред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдпреЗ рдЪрд▓реЗрдЧрд╛. рдореЗрд░рд╛ рдкрд╕рдВрджреАрджрд╛ рддрд░реАрдХрд╛ рдЖрдИрдУ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд▓реНрдХрд╛ рд╕реНрдкрд░реНрд╢ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореМрдЬреВрджрд╛ рдкрд╛рд░реНрд╕рд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдПрд╕рд┐рдВрдХ рдЖрдИрдУ рдХреЗ рд╕рд╛рдеред рдпрд╣ рдХреНрд▓реАрдирд░ рд╣реЛрдЧрд╛ рдпрджрд┐ рджреЛ рдкрд╛рд░реНрд╕рд░ рд╡рд░реНрдЧ рд╣реБрдб рдХреЗ рддрд╣рдд рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реИрдиреНрд╕-рдЖрдИрдУ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореМрдЬреВрджрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдФрд░ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдзрд┐рдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдкреНрд░рд╕рдВрдЧ-рд╕реНрдерд╛рдиреАрдп рд╕рдорд░реНрдерди рдмрд╣реБрдд рдирд╛рдЬреБрдХ рд╣реИред

рд╕рдВрджрд░реНрдн рд╕реНрдерд╛рдиреАрдп (asyncio рдХреЗ рд▓рд┐рдП) 3.7 stdlib рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВред https://docs.python.org/3.7/library/contextvars.html
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд╛рдЗрдерди рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреЙрдореНрдкреЗрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред (рдпрд╛ рдлрд┐рд░ рдорд╛рди рд▓реЗрдВ рдХрд┐ рдлреНрд▓рд╛рд╕реНрдХ рдкрд░ ASGI рдПрдХ 3.7+ рдЪреАрдЬрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛)

рдХреНрдпрд╛ Werkzeug рдереНрд░реЗрдб-рд▓реЛрдХрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ? (рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдлреНрд▓рд╛рд╕реНрдХ рдХрд░рддрд╛ рд╣реИ)

рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рдЬрдм ASGI рдХреЗ рддрд╣рдд рдЪрд▓ рд░рд╣рд╛ рд╣реЛ, рдПрдХ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдСрди-рдбрд┐рдорд╛рдВрдб рдлреЙрд░реНрдо рдбреЗрдЯрд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдлреЙрд░реНрдо рдбреЗрдЯрд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдкреЗрд╢рдХрд╢ рди рдХрд░реЗрдВред (рдпрд╛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрд░реЛрдз рдирд┐рдХрд╛рдп рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП), рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдмрд╕ рдЙрд╕ рдкрд░ async API рдХреА рдкреЗрд╢рдХрд╢ рдХрд░реЗрдВред рдпрд╣рд╛рдВ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдЯрд╛рд░рд▓реЗрдЯ рдХрд╛ рдПрдкреАрдЖрдИ рджреЗрдЦреЗрдВ... https://github.com/encode/starlette#body

рдЪреВрдВрдХрд┐ рдкрд╛рдпрдерди 3.7 рдмрд╛рд╣рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрдм рддрдХ рдХреЛрдИ рдЕрдиреНрдп рдХреЛрдб рдЗрд╕рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддрдм рддрдХ рдореИрдВ рдкрд╛рдЗрдерди 3.7 рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╡рд╛рд▓реЗ рдПрд╕рд┐рдВрдХ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреЛрдИ рдмреИрдХрдкреЛрд░реНрдЯ рд╣реИ рдЬреЛ рджреЗрд╢реА 3.7 рд╕рдорд╛рдзрд╛рди рдЬрд┐рддрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ - рдФрд░ рднреА рдмреЗрд╣рддрд░!

рдПрд╕рд┐рдВрдХ рдлреЙрд░реНрдо рдбреЗрдЯрд╛ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ ... рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрд╕рд┐рдВрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ await request.parse() рдЬреИрд╕рд╛ рдХреБрдЫ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛, рдФрд░ рдлрд┐рд░ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдлреЙрд░реНрдо рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рдЕрдкрд╡рд╛рдж рдЙрдард╛рдПрдВ?

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдпрд╛ рдмрд╕ values рдФрд░ рджреЛрд╕реНрддреЛрдВ рдХреЛ рдЦреБрдж рдХреЛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдмрдирд╛рдПрдВ: values = await request.values рдпрд╛ values = await request.values() , рдЬреЛ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП (await request.form)['foo'] рдЬреИрд╕реА рдмрджрд╕реВрд░рдд рдЪреАрдЬреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА, рдЬрдмрдХрд┐ рдмреАрдЪ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рд╕реАрдзреЗ рдПрдХ рддрд╛рдирд╛ рддрддреНрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╕рдордп рдПрдХ рдПрд╕рд┐рдВрдХ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП?

рд╣рд╛рдВ :(

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЯрд╛рд▓рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛

form = await request.form
form['foo']

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рдмрджрд╕реВрд░рдд рд╣реИ

await request.parse()
request.form['foo']

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрд╡рд╛рдж рдХреЗ рдЕрдзреАрди рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ "async dict" рдХрд╛ рднреА рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ _members_ рд╕рднреА async-ified рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдХреЛ рджреЗрдЦреЗ рдмрд┐рдирд╛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрдЧрд╛ред

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдпрд╛ рдХреЗрд╡рд▓ рдореВрд▓реНрдпреЛрдВ рдФрд░ рдорд┐рддреНрд░реЛрдВ рдХреЛ рд╕реНрд╡рдпрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдмрдирд╛рдПрдВ: рдорд╛рди = рдЕрдиреБрд░реЛрдз рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред рдорд╛рди рдпрд╛ рдорд╛рди = рдкреНрд░рддреАрдХреНрд╖рд╛ рдЕрдиреБрд░реЛрдзред рдорд╛рди (), рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдзрд┐рдХрддрд░ рдЕрдЪреНрдЫрд╛ рджрд┐рдЦрддрд╛ рд╣реИред

рдореИрдВ рдЧреБрдгреЛрдВ рдХреЗ рдмрдЬрд╛рдп I/O-рдкреНрд░рджрд░реНрд╢рди рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛ред

рдХреНрдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрджрд╕реВрд░рдд рдЪреАрдЬреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА рдЬреИрд╕реЗ (рдкреНрд░рддреАрдХреНрд╖рд╛ рдЕрдиреБрд░реЛрдз.рдлреЙрд░реНрдо) ['foo'] рдПрдХ рдПрд╕рд┐рдВрдХ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ рдПрдХ рддрд╛рдирд╛ рддрддреНрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╕рдордп рдмреАрдЪ рдореЗрдВ рдЕрд╕рд╛рдЗрди рдХрд┐рдП рдмрд┐рдирд╛?

рд╢реНрд░реБрдЧ - рдРрд╕рд╛ рдордд рдХрд░реЛред

asyncio рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХреЛрдбрдмреЗрд╕ рдХреЗ рдХреМрди рд╕реЗ рд╣рд┐рд╕реНрд╕реЗ I/O рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

form = await request.form()
form['foo']

рдЬрдмрдХрд┐ рдореИрдВ рдПрд╕рд┐рдВрдХ рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реВрдВ, рд╣рдо рдЕрднреА рднреА рдкрд╛рдпрдерди 2 рдФрд░ рд╕рд┐рдВрдХ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рддреЛрдбрд╝ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ @njsmith рд╕реЗ рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ async рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрдирд╛ рд╣реИ, рдлрд┐рд░ рд╕рд┐рдВрдХ рд╕рдВрд╕реНрдХрд░рдг рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 2to3 рдХреЗ рд╕рдорд╛рди рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рдЗрд╕реЗ urllib3 рдореЗрдВ рдЖрдЬрд╝рдорд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдо request.form рдЖрджрд┐ рдХреЗ рдкреАрдЫреЗ рдХреА рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдЬрд╛рджреВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдХреЙрд▓ рдХрд░рдирд╛ рдПрд╕рд┐рдВрдХ рд╕рд╛рдорд╛рди рдХрд░реЗрдЧрд╛ рдЬрдмрдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рддрд╛рдирд╛рд╢рд╛рд╣реА рд╡рд┐рдзрд┐рдпрд╛рдВ рд╕рд┐рдВрдХ рд╣реЛ рдЬрд╛рдПрдВрдЧреА (рдФрд░ рдПрд╕рд┐рдВрдХ рдореЛрдб рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдВрдЧреА)ред рдпрд╛ рд╣рдо async рдореЛрдб рдореЗрдВ request.form рдЖрджрд┐ рддрдХ рдХрд┐рд╕реА рднреА рдПрдХреНрд╕реЗрд╕ рдХреЛ рд╡рд┐рдлрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ async рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ request.parse_form() ред

рдпрд╛... request_class = AsyncRequest рдЕрдЧрд░ рдХреЛрдИ рдПрд╕рд┐рдВрдХреНрд╕ рдЪрд╛рд╣рддрд╛ рд╣реИ; рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ AsyncFlask рд╡рд░реНрдЧ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╛... request_class = AsyncRequest рдЕрдЧрд░ рдХреЛрдИ рдПрд╕рд┐рдВрдХреНрд╕ рдЪрд╛рд╣рддрд╛ рд╣реИ; рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ AsyncFlask рд╡рд░реНрдЧ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рдЙрд╕ рддрд░рд╣ рдХрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ рдЬреЛ рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдЖрдПрдЧрд╛, рд╣рд╛рдБред

рдкреНрд░рдкрддреНрд░ рдкрд╛рд░реНрд╕рд░ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдореИрдВрдиреЗ рдЗрд╕реЗ #1330 рдореЗрдВ sansio-ing рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИред

100% рдХрд╡рд░реЗрдЬ рдХреЗ рд╕рд╛рде https://github.com/andrew-d/python-multipart рдкрд░ рдПрдХ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдлреЙрд░реНрдо рдкрд╛рд░реНрд╕рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднреА рд╣реИред (рдореИрдВрдиреЗ рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рдкрд╛рдпрд╛ рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ "рдлрд╝реАрдб рдбреЗрдЯрд╛, рд╣реИрдВрдбрд▓ рдЗрд╡реЗрдВрдЯреНрд╕" рдкреНрд░рд╡рд╛рд╣ рдореЗрдВ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред)

python-multipart рд╡рд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореИрдВ рдЕрдм рд╕реНрдЯрд╛рд░рд▓реЗрдЯ рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЖрдк рдпрд╣рд╛рдБ async рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ: https://github.com/encode/starlette/blob/master/starlette/formparsers.py#L207

рдореИрдВ рдПрдХ рд╕рд┐рдВрдХ рдФрд░ рдПрд╕рд┐рдВрдХ рд╕рдВрдЧрдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд╕рд░реНрд╡реЛрддреНрддрдо рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╕реНрдЯрд╛рд░рд▓реЗрдЯ рдХреЗ рд▓рд┐рдП рднреА рдЪрд╛рд╣рддрд╛ рд╣реВрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд░реНрдХрдЬрд╝реЗрдЧ рдХреА рджреВрд╕рд░реА рджрд┐рд╢рд╛ рдореЗрдВ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ "рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдореМрдЬреВрджрд╛ рдПрд╕рд┐рдВрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, рдореИрдВ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЕрдм рдПрдХ рд╕рд┐рдВрдХ рднреА рдкреЗрд╢ рдХрд░реЗрдВ")

рд╕реНрдЯрд╛рд░рд▓реЗрдЯ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╢рд╛рдпрдж рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЛ async parse(self) рд╡рд┐рдзрд┐ рдореЗрдВ рдзрдХреНрдХрд╛ рджреВрдВрдЧрд╛, рдФрд░ рдЖрдо рддреМрд░ рдкрд░ рдЕрдиреБрд░реЛрдз рдкреНрд░реЗрд╖рдг рдХреЗ рджреМрд░рд╛рди рдХрднреА-рдХрднреА рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдирд┐рдпрдорд┐рдд рд╕рд╛рджреЗ рдЧреБрдгреЛрдВ рдХрд╛ рдкрд░реНрджрд╛рдлрд╛рд╢ рдХрд░рддрд╛ рд╣реВрдВ form , files рдЖрджрд┐ ... рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рд╕реЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдПред

рд╡рд┐рд╖рдп рд╕реЗ рд╣рдЯрдХрд░, рд▓реЗрдХрд┐рди рдПрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рдПрдПрд╕рдЬреАрдЖрдИ рдФрд░ рд╡рд░реНрдХрдЬрд╝реЗрдЧ рдорд╛рдорд▓реЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд (рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкрдЯрд░реА рд╕реЗ рдирд╣реАрдВ рдЙрддрд╛рд░рдирд╛ рдЪрд╛рд╣рддрд╛, рд▓реЗрдХрд┐рди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрджрд╛рд░реНрде рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдореБрджреНрджрд╛ рдирд╣реАрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛):

рдпрджрд┐ рдЖрдк ./manage.py runserver_plus рдХреЗ рд╕рд╛рде https://github.com/django-extensions/django-extensions рдЪрд▓рд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ https://github.com/django/channels (рдЬреЛ ASGI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ) Opcode -1 рджреЗ рд░рд╣рд╛ рд╣реИ ./manage.py runserver рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред

(рд╡реЗрд░реНрдХрдЬрд╝реЗрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдбреАрдЬреЗрдВрдЧреЛ рдкрд░ django-рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рд╛рде рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдореИрдВрдиреЗ рдХреБрдЫ рдШрдВрдЯреЛрдВ рдХрд╛ рд╕рдордп рдмрд┐рддрд╛рдпрд╛ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВ рдореБрдЭреЗ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП runserver_plus рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрджрдд рд╣реИ)

рдореИрдВ runserver_plus рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдореИрдВ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ https рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреВрдВред
рдЕрдм рдореИрдВ Django рдЪреИрдирд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Websockets рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рднрд╛рдЧ рд▓рд┐рдпрд╛ рд╣реИ рдХрд┐ рдЪреИрдирд▓ рд░рдирд░рд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ runserver_plus рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЪреИрдирд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдпрд╛ рдореИрдВ https рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рджреЛрдиреЛрдВ рдХрд╛ рдирд╣реАрдВ!

@davidism рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ рдЖрдкрдХреЗ рдЕрдВрддрд┐рдо рдЙрддреНрддрд░ рдХреЗ рдмрд╛рдж рд╕реЗ рдлреНрд▓рд╛рд╕реНрдХ рдХреЗ рд▓рд┐рдП ASGI рд╕рдорд░реНрдерди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдЖрдпрд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЖрдкрдХреА рдпреЛрдЬрдирд╛рдПрдВ Python 2 рдХреЗ рд╕рдорд░реНрдерди рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓ рдЧрдИ рд╣реИрдВ?

2 рдЬреБрд▓рд╛рдИ 2018 рдХреЛ @davidism рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рдЗрд╕реЗ urllib3 рдореЗрдВ рдЖрдЬрд╝рдорд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред

рдЗрд╕реЗ рдЕрднреА рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рджреЗрдЦрд╛ рдерд╛ - рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╕реАрдЦрдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд╛рдпрдерди-рдЯреНрд░рд┐рдпреЛ/urllib3#1 рдореЗрдВ рд╡рд┐рд╡рд░рдг рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд╣реИред urllib3/urllib3#1323 рдХреЗ рд▓рд┐рдВрдХ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ, рдЬрд┐рд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

рд╕рдорд╛рдзрд╛рди: рд╣рдо рдХреЛрдб рдХреА рдПрдХ рдкреНрд░рддрд┐ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реИрдВ - async/рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдПрдиреЛрдЯреЗрд╢рди рд╡рд╛рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг - рдФрд░ рдлрд┐рд░ рдПрдХ рдЫреЛрдЯреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдХреЗ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЙрдкреА рдХреЛ рдмрдирд╛рдП рд░рдЦрддреА рд╣реИред рдпрд╣ рд╕реБрдВрджрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд╣рд╛рдБ рддрдХ рдореИрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдБ рд╕рднреА рд╡рд┐рдХрд▓реНрдк рдмрджрддрд░ рд╣реИрдВ...

(рдпрджрд┐ рд░реБрдЪрд┐ рд╣реЛ рддреЛ рд╡рд╣рд╛рдВ рдкрдврд╝рддреЗ рд░рд╣реЗрдВред)

рдпрд╣ рджреЗрдЦрдХрд░ рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛ рдХрд┐ https://github.com/python-trio/urllib3/commits/bleach-spike рдкрд░ рд╣реЛ рд░рд╣реА рдирд┐рд░рдВрддрд░ рдкреНрд░рдЧрддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗ рд╣реБрдП рд╣реИред

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рд░рдбрд╛рд░ рдкрд░ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЫреЛрдЯрд╛ рд╕рд╛ рдЭрдЯрдХрд╛ред рдЗрд╕ рд╕рд╛рд▓ 3.5 рдИрдУрдПрд▓ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд╕рд╛рде, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрд╕рд┐рдВрдХ рд╕рдкреЛрд░реНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдордп рд╣реИ?

рдЗрд╕реЗ рдкреЛрд╕реНрдЯ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рдбреЗрдврд╝ рд╕рд╛рд▓ рдореЗрдВ, рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реБрдИ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдПрд╕рд┐рдиреНрд╕рд┐рдпреЛ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдиреБрднрд╡ рдпрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдПрдПрд╕рдЬреАрдЖрдИ рдкрд╕рдВрдж рд╣реИ, рдпрд╣ рдХрднреА рднреА рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рдерд╛ рдЬрд┐рд╕реЗ рдореИрдВ рдЦреБрдж рд╕реЗ рд▓реЗрдиреЗ рдЬрд╛ рд░рд╣рд╛ рдерд╛ред

рдЗрд╕ рдмреАрдЪ, рдХреНрд╡рд╛рд░реНрдЯ рдХреЗ рд▓реЗрдЦрдХ @pgjones , Werkzeug рдореЗрдВ рдЕрдзрд┐рдХ рд╢рд╛рдорд┐рд▓ рд╣реЛ рдЧрдП рд╣реИрдВред Quart рдЕрдм рдЬрд╣рд╛рдВ рд╕рдВрднрд╡ рд╣реЛ, рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗ Werkzeug рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдЗрд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд░рд╣реЗ рд╣реИрдВред рдПрдПрд╕рдЬреАрдЖрдИ рдХреЗ рд╕рд╛рде рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдлреНрд▓рд╛рд╕реНрдХ рд░рдЦрд░рдЦрд╛рд╡ рд╕реЗ рдХреБрдЫ рдкреБрд╢рдмреИрдХ рдерд╛, рдЗрд╕рд▓рд┐рдП рдлрд┐рд▓ рдиреЗ рдкреИрд▓реЗрдЯ/рдлреНрд▓рд╛рд╕реНрдХ # 3412 рднреА рдмрдирд╛рдпрд╛ рдЬреЛ рдХрдо рд╕реЗ рдХрдо async def рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд░реВрдЯ рдХрд░рдиреЗ рдХреА рдЗрдЬрд╛рдЬрдд рджреЗрддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╡рд╣ рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рдмреИрдард╛ рд╣реИред рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдордЭреМрддрд╛ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп ASGI рдЬрд╛рдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред @ edk0 рдиреЗ рдлреЙрд░реНрдо рдкрд╛рд░реНрд╕рд┐рдВрдЧ sans-io рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП #1330 рдмрдирд╛рдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рднреА рдмреИрдард╛ рд╣реИ, рдФрд░ рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рдХреБрдЫ рдФрд░ рдбрд┐рдЬрд╝рд╛рдЗрди рдФрд░ рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЖрдк рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВ, "рдЬреИрдВрдЧреЛ рдиреЗ рдЬреЛ рдХрд┐рдпрд╛ рд╡рд╣ рдлреНрд▓рд╛рд╕реНрдХ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛?" рдореИрдВ Django рдХреЗ рдЖрдВрддрд░рд┐рдХ рдкрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди @andrewgodwin рдиреЗ рдореБрдЭреЗ рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рд╕рдордЭрд╛рдпрд╛ рдерд╛ рдХрд┐ Django рдХреЗ рдкрд╛рд╕ рдЗрд╕рдХрд╛ "рдЖрд╕рд╛рди" (рдкрдврд╝реЗрдВ: рдЕрднреА рднреА рдмрд╣реБрдд рдЬрдЯрд┐рд▓) рд╕рдордп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдбрдмреНрд▓реВрдПрд╕рдЬреАрдЖрдИ рдХреЗ рдЕрдиреБрдХреВрд▓ рдХреИрд╕реЗ рд╣реИ, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдмрд╣реБрдд рд╣реА WSGI-рдХреЗрдВрджреНрд░рд┐рдд API рдЬрд┐рд╕рдХреЗ рд╕рд╛рде Werkzeug рдФрд░ Flask рдиреЗ рд╢реБрд░реБрдЖрдд рдХреА рдереАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, Django рдХреЛ рдкреИрд▓реЗрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рд┐рд░реНрдл рдПрдХ рдЯрди рдЕрдзрд┐рдХ рдкреВрд░реНрдгрдХрд╛рд▓рд┐рдХ рдзреНрдпрд╛рди рдФрд░ рд╕рдВрд╕рд╛рдзрди рдорд┐рд▓рддреЗ рд╣реИрдВред

рддреЛ рд╡рд╣ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдХрд╣рд╛рдБ рдЫреЛрдбрд╝рддрд╛ рд╣реИ? рдпрджрд┐ рдЖрдк рдПрдХ рдлреНрд▓рд╛рд╕реНрдХ-рд╕рдВрдЧрдд рдврд╛рдВрдЪрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ Werkzeug рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ Quart рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдХреНрд╡рд╛рд░реНрдЯ (рдпрд╛ рдлреНрд▓рд╛рд╕реНрдХ) рдореЗрдВ рдпреЛрдЧрджрд╛рди рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЕрдзрд┐рдХ рдПрдкреАрдЖрдИ рд╕рдВрдЧрдд рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдЬрд╣рд╛рдВ рд╡рд╣ рдЧрд╛рдпрдм рд╣реИред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ Werkzeug рдФрд░ Flask ASGI рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ, рддреЛ рдЖрдкрдХреЛ рдХрджрдо рдмрдврд╝рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред ASGI рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВред Werkzeug's API рдХреЗ WSGI-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдФрд░ рдЕрд╡рд░реБрджреНрдз рднрд╛рдЧреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдирд╛ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВред рдЕрдореВрд░реНрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ рдЬрд┐рд╕реЗ рд╣рдо WSGI рдФрд░ ASGI рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд░ рдЙрд╕ рд╢реЛрдз рдХреЛ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдореЗрдВ рд╡рд╛рдкрд╕ рд▓рд╛рдПрдВ рддрд╛рдХрд┐ рд╣рдо рдкреАрдЖрд░ рдбрд┐рдЬрд╛рдЗрди рдФрд░ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХреЗрдВред

рдХреНрд╡рд╛рд░реНрдЯ рд╕реБрдЭрд╛рд╡ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореБрдЭреЗ рдЗрд╕рдореЗрдВ рдпреЛрдЧрджрд╛рди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЦреБрд╢реА рд╣реЛрдЧреАред

рдореИрдВрдиреЗ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХреНрдпреЛрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлреНрд▓рд╛рд╕реНрдХ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдЬреЛ Django рдиреЗ рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ рдХрд┐рдпрд╛ рд╣реИред рдЕрдВрддрддрдГ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреИрд▓реЗрдЯ/рдлреНрд▓рд╛рд╕реНрдХ#3412 рдлреНрд▓рд╛рд╕реНрдХ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИред

Werkzeug рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ ASGI рдХреБрдЫ рджрд░реНрдж рдХреЗ рд╕рд╛рде рд╕рдВрднрд╡ рд╣реИред рджрд░реНрдж рдХрд╛ рдПрдХ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рдЙрджрд╛рд╣рд░рдг рдпрд╣ рд╣реИ рдХрд┐ Werkzeug рдореЗрдВ рдХрдИ рдЪреАрдЬреЗрдВ WSGI рдХреЙрд▓реЗрдмрд▓ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЕрдкрд╡рд╛рдж)ред рдПрдПрд╕рдЬреАрдЖрдИ рдХреЗ рд╕рд╛рде рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ/рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рд╣рдЯрд╛рдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред

рдореЗрд░реА рдпреЛрдЬрдирд╛ рд╡рд░реНрдХрдЬрд╝реЗрдЧ рдХреЛ рдХреНрд╡рд╛рд░реНрдЯ рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░рддреЗ рд░рд╣рдиреЗ рдХреА рд╣реИ рдФрд░ рд╡рд░реНрдХрдЬрд╝реЗрдЧ рдХреЛ рдПрдПрд╕рдЬреАрдЖрдИ (рд╕реИрдиреНрд╕-рдЖрдИрдУ) рдХреА рдУрд░ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рддреЗ рд░рд╣рдирд╛ рд╣реИ (рдЬрд┐рддрдирд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) - рдореЗрд░реА рдПрдХрдорд╛рддреНрд░ рдмрд╛рдзрд╛ рд╕рдордп рдХреА рдХрдореА рд╣реИред

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

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

SimonSapin picture SimonSapin  ┬╖  12рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

masklinn picture masklinn  ┬╖  11рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

davidism picture davidism  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mhelmetag picture mhelmetag  ┬╖  8рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

androiddrew picture androiddrew  ┬╖  14рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ