Werkzeugã«ã¯å€ãã®äŸ¿å©ãªæ¹æ³ããããŸããæåããå§ããããããASGIããµããŒãããŠããæ¹ãã¯ããã«ç°¡åã§ãã
ã¯ããWerkzeugãšFlaskã¯æçµçã«ASGIããµããŒãããŸãã ç§ã«ã¯ããã®ã¿ã€ã ã©ã€ã³ããããŸãããã誰ããPRãéå§ããå Žåã¯ãPRã®ã¬ãã¥ãŒãåãã§ãæäŒãããŸãã
ãã ãããããå®è£ ããã®ã¯ç§ã§ã¯ãããŸãããã³ãã¥ããã£ã®æ¯æŽãå¿ èŠã§ãã 以äžã®ææ°ã®æŽæ°ãåç §ããŠãã ããïŒ https ïŒ//github.com/pallets/werkzeug/issues/1322#issuecomment -600926145
ç§ã¯ããã«åãçµãããšã«èå³ããããŸãã
ç§ã¯ããã€ãã®æ©èœããŠãããããããŒãªASGIãµããŒããè¡ã£ãŠããŸãïŒ werkzeug ã flask ã å ã«é²ãåã«ãããªããæã£ãŠãããããããªãèšç»ã«ã€ããŠãã£ãšç解ããããšæããŸãã
ç§ãããã§è¡ã£ãããšãã¹ãŠãäžè¬çã«ãã£ãšè¯ããããããªããšããäºå®ãè¶ ããŠãç§ã«ãã§ã«èµ·ãã£ãŠããããšïŒ
ææ³ãèãããŠãã ããã
ã¹ã¬ããã§åæã³ãŒããå®è¡ããã ãã§ãã©ãŒã ããŒãµãŒããµããŒãããŠããŸãïŒããŒã¿ãéåæã§èªã¿åããšãã«ãããã¯ããŸãïŒã ç§ã¯ãããããŸããããšã¯æããªãã ç§ã®å¥œãŸããã¢ãããŒãã¯ãIOãé€å€ããããšã§ãã
軜ãã¿ããã®ã¢ãããŒãã¯ãæ¢åã®ããŒãµãŒãåå®è£ ããããšã§ãããéåæIOã䜿çšããããšã«ãªããšæããŸãã 2ã€ã®ããŒãµãŒã¯ã©ã¹ãå éšã§å ±éã®sans-IOå®è£ ãå ±æã§ããã°ããã¯ãªãŒã³ã«ãªããŸãããæ¢åã®å®è£ ãè€è£œããŠãããã«å€æŽããã ãã®æ¹ãå®çšçãããããŸããã
ã³ã³ããã¹ãããŒã«ã«ãµããŒãã¯ããªãå£ããããã§ãã
ã³ã³ããã¹ãããŒã«ã«ïŒasyncioã®å ŽåïŒã¯3.7stdlibã«ååšããŸãã https://docs.python.org/3.7/library/contextvars.html
以åã®ããŒãžã§ã³ã®PythonããµããŒãããããã«ããªãã·ã§ã³ã®compatã©ã€ãã©ãªãšãšãã«ãããã䜿çšãããšæããŸãã ïŒãŸãã¯ãFlaskã®ASGIã3.7以äžã«ãªããšä»®å®ããŸãïŒ
werkzeugã¯ã¹ã¬ããããŒã«ã«ã䜿çšããŸããïŒ ïŒç§ã¯Flaskãããããããšãç¥ã£ãŠããŸãïŒ
ASGIã§å®è¡ããŠããå Žåãåæé¢æ°ã®ãã©ãŒã ããŒã¿ããªã³ããã³ãã§è§£æããæ確ãªæ¹æ³ã¯ãããŸããã
ãã©ãŒã ããŒã¿ã解æããããã®åæã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããªãããšããå§ãããŸãã ïŒãŸãã¯ãäœããã®æ¹æ³ã§ãªã¯ãšã¹ãæ¬æã«ã¢ã¯ã»ã¹ããããïŒã代ããã«éåæAPIãæäŸããŸãã ããã§ããã€ãã®äŸã«ã€ããŠã¯Starletteã®APIãåç §ããŠãã ãã... httpsïŒ//github.com/encode/starlette#body
Python 3.7ããªãªãŒã¹ãããã®ã§ãä»ã®ã³ãŒãã圱é¿ãåããªãéããPython3.7ãå¿ èŠãšããéåææ©èœãæã€ããšã«å察ããããšã¯ãããŸããã ãããããã€ãã£ã3.7ãœãªã¥ãŒã·ã§ã³ãšåããããåªããããã¯ããŒããããå Žåã¯ããã«åªããŠããŸãïŒ
éåæãã©ãŒã ããŒã¿ã®è§£æã«ã€ããŠ...éåæé¢æ°ã®await request.parse()
ã®ãããªãã®ã§ååã ãšæããŸããã解æãããŠããªããã©ãŒã ããŒã¿ã«ã¢ã¯ã»ã¹ããããšãããšäŸå€ãçºçããŸããïŒ
確ãã«ããŸãã¯åã«values
ãšåéãéåæã«ããŸãïŒ values = await request.values
ãŸãã¯values = await request.values()
ãäž»ã«ã©ã¡ããèŠæ ããè¯ããã«ãã£ãŠç°ãªããŸãã
éã«å²ãåœãŠãã«çŽæ¥dictèŠçŽ ãååŸããªããéåæåŒã³åºããè¡ãã«ã¯ã (await request.form)['foo']
ã®ãããªããªãéããã®ãå¿
èŠã§ã¯ãªãã§ããããã
ã¯ã ïŒïŒ
ãããããããç¹ã«åé¿ã§ãããã©ããã¯ããããŸããã ç§ã¯æããªã
form = await request.form
form['foo']
æ¬åœã«éãã§ã
await request.parse()
request.form['foo']
ããã¯æããã«å¥œã¿ã«å·Šå³ãããŸããã
代ããã«_members_ããã¹ãŠéåæåããããasyncdictããçºæããããšãã§ãããšæããŸããããããèŠãŠããªããšãããªãæ··ä¹±ããŠããŸããšæããŸãã
確ãã«ããŸãã¯åã«å€ãšåéãéåæã«ããïŒvalues = awaitrequest.valuesãŸãã¯values = await request.valuesïŒïŒãäž»ã«ã©ã¡ããèŠæ ããè¯ããã«äŸåããŸãã
ããããã£ã§ã¯ãªããI / Oå®è¡æäœã«é¢æ°åŒã³åºãã䜿çšããããšããå§ãããŸãã
ïŒawait request.formïŒ['foo']ã®ããã«ãéã«å²ãåœãŠãã«çŽæ¥dictèŠçŽ ãååŸããªããéåæåŒã³åºããè¡ãã«ã¯ãããªãéããã®ãå¿ èŠã§ã¯ãªãã§ããããã
è©ããããã-ããããªãã§ãã ããã
asyncioã¯ãã³ãŒãããŒã¹ã®ã©ã®éšåãI / Oãå®è¡ãããã«ã€ããŠå¿ ç¶çã«ããæ確ã«ãªããããããããå¥ã ã®è¡ã«åå²ããåŸåããããŸãã
form = await request.form()
form['foo']
ç§ã¯éåæãµããŒããè¿œå ããããšã«å šåã泚ãã§ããŸãããPython2ãšåæããŒãžã§ã³ãå£ãããšã¯ã§ããŸããã @njsmithããèããã¢ãããŒãã®1ã€ã¯ããã¹ãŠãéåæãšããŠèšè¿°ãã2to3ãšåæ§ã®ããŒã«ã䜿çšããŠåæããŒãžã§ã³ãçæããããšã§ãã ã©ãããããã¯urllib3ã§è©ŠãããŠããããã§ãããç§ã¯ããã«ã€ããŠååã«ç¥ããŸããã
request.form
ãªã©ã®èåŸã«ãããªããžã§ã¯ãã«éæ³ãè¿œå ã§ããã®ã§ã¯ãªãããšæããŸãããã®ããããªããžã§ã¯ããåŒã³åºããšãéåžžã®dictã®ãããªã¡ãœãããåæãããŠããéã«éåæåŠçãå®è¡ãããŸãïŒéåæã¢ãŒãã§ã¯å€±æããŸãïŒã ãŸãã¯ãéåæã¢ãŒãã§request.form
ãªã©ãžã®ã¢ã¯ã»ã¹ã«å€±æããéåæããŒãžã§ã³ã«å¥ã®ååïŒ request.parse_form()
$ãªã©ïŒã䜿çšããããšãã§ããŸãã
ãŸãã¯...誰ããéåæãæãã§ããå Žårequest_class = AsyncRequest
ã ããã¯ãå®éã«ã¯AsyncFlask
ã¯ã©ã¹ã®ããã©ã«ãã§ããå¯èœæ§ããããŸãã
ãŸãã¯... request_class = AsyncRequestïŒèª°ããéåæãåžæããå ŽåïŒã ããã¯ãå®éã«ã¯AsyncFlaskã¯ã©ã¹ã®ããã©ã«ãã§ããå¯èœæ§ããããŸãã
ããã¯ç§ã«ãšã£ãŠçã«ããªã£ãŠãããããªã¢ãããŒãã§ããããã
ãã©ãŒã ããŒãµãŒã«é¢ããŠã¯ãïŒ1330ã§sansio-ingãè©Šã¿ãŸããã
https://github.com/andrew-d/python-multipartã«ã¯ã100ïŒ ã«ãã¬ããžã®ã¹ããªãŒãã³ã°ãã©ãŒã ããŒãµãŒã®å®è£ ããããŸãã ïŒç§ã¯ãã1ã€èŠã€ããŸããããããããããŒã¿ã®ãã£ãŒããã€ãã³ãã®åŠçããããŒã«ç°¡åã«é©å¿ã§ãããã©ããã¯æããã§ã¯ãããŸããã§ãããïŒ
python-multipart
ã¯ãçŸåšStarletteã«äœ¿çšããŠããã©ã€ãã©ãªã§ãã ããã§éåæã¹ããªãŒã ãšã®çµ±åãèŠãããšãã§ããŸãïŒ https ïŒ//github.com/encode/starlette/blob/master/starlette/formparsers.py#L207
Starletteã«ãå¿ èŠãªã®ã§ãåæããã³éåæäºæã®ã€ã³ã¿ãŒãã§ã€ã¹ãæ瀺ããããã®æè¯ã®æ¹æ³ã«ã€ããŠãèããŠããŸãïŒãã ããWerkzeugãšã¯éã®æ¹åã«é²ãã§ããŸãããç§ã«ãšã£ãŠã¯ããæ¢åã®éåæã€ã³ã¿ãŒãã§ã€ã¹ããããŸããã©ãããã°ããã§ããïŒåæã®ãã®ãæ瀺ããããã«ãªããŸãããïŒ
Starletteã®å Žåãããããå®éã®è§£æãasync parse(self)
ã¡ãœããã«ããã·ã¥ããéåžžã¯ãªã¯ãšã¹ãã®ãã£ã¹ãããäžã«ãããåŒã³åºããŸãããéåžžã®ãã¬ãŒã³ããããã£form
ã files
ãªã©ãå
¬éããŸãã ...ãŠãŒã¶ãŒã³ãŒãããã®çµæã«ã¢ã¯ã»ã¹ããããã
ãããã¯ããå€ããŠããŸããã人æ°ã®ããASGIãšwerkzeugã®ã±ãŒã¹ã«é¢é£ããŠããŸãïŒãã®åé¡ãè±ç·ããããã¯ãããŸããããè¿œå ããå 容ã®ãªãéè€ããåé¡ãäœæããããããŸããïŒïŒ
https://github.com/django-extensions/django-extensionsã./manage.py runserver_plus
ã§å®è¡ããŠããŠã httpsïŒ//github.com/django/channels ïŒASGIã䜿çšïŒãOpcode -1
ãæäŸããŠããå Žåã€ã³ã¹ãã¯ã¿ãŒã§./manage.py runserver
ãå®è¡ããŠã¿ãŠãã ããã
ïŒWerkzeugã¯django-extensionsã䜿çšããŠDjangoã®å
éšã§äœ¿çšãããŠããããããã°çšã«runserver_plus
ã䜿çšããŠéçºããããšã«æ
£ããŠããã®ã§ããã®çç±ãç解ããããã«æ°æéãè²»ãããŸããïŒ
éçºã§httpsã䜿çšã§ããããã«ãrunserver_plusã䜿çšããŠããŸãã
çŸåšãDjangoãã£ãã«ã䜿çšããŠWebsocketãµããŒããè¿œå ããããšããŠããŸããããã£ãã«ãrunserverã䜿çšããrunserver_plusããµããŒãããªããšããåé¡ãçºçããŸããã ãããã£ãŠããã£ãã«ã䜿çšããããšããhttpsã䜿çšããããšãã§ããŸãããäž¡æ¹ã䜿çšããããšã¯ã§ããŸããã
@davidismã¯ããã®ãããã¯ã§ã®æåŸã®åç以éãFlaskã®ASGIãµããŒãã®å®è£ ã«å€æŽããã£ããã©ãããããã³Python2ã®ãµããŒããçµäºããããã«ãã®ã¿ã¹ã¯ã«é¢é£ããŠèšç»ãå€æŽããããã©ãããæããŠãã ããã
2018幎7æ2æ¥ã @ davidismã¯æ¬¡ã®ããã«æžããŠããŸãã
ã©ãããããã¯urllib3ã§è©ŠãããŠããããã§ãããç§ã¯ããã«ã€ããŠååã«ç¥ããŸããã
ãã°ããåãããããèŠãã°ããã§ãã誰ãããã£ãšåŠã³ãããšæã£ãŠãããªããpython-trio / urllib3ïŒ1ã«ã¯ããããã®è©³çŽ°ãããããã§ãã urllib3 / urllib3ïŒ1323ãžã®ãªã³ã¯ã«æ³šæããŠãã ãããããã«ã¯æ¬¡ã®ãã®ãå«ãŸããŸãã
解決çïŒã³ãŒãã®1ã€ã®ã³ããŒïŒasync / awaitã¢ãããŒã·ã§ã³ãä»ããããŒãžã§ã³ïŒãç¶æããŠãããå°ããªã¹ã¯ãªãããããããèªåçã«åé€ããããšã§åæã³ããŒãç¶æããŸãã ããã¯çŸããã¯ãããŸããããç§ãç¥ãéãããã¹ãŠã®éžæè¢ã¯ãã£ãšæªãã§ã...
ïŒèå³ãããã°ããã§èªã¿ç¶ããŠãã ãããïŒ
ãã®åé¡ãã¬ãŒããŒã«æ»ãããã®å°ããªãã³ãã ä»å¹Ž3.5ãEOLã«å°éããã®ã§ãéåæãµããŒãã«ã€ããŠèãå§ããã®ã«è¯ãææã ãšæããŸããïŒ
ãããæ²èŒãããŠãã1幎åã®éããããå®è£ ããããã®æŽ»åã¯ããŸããããŸããã§ããã å人çã«ã¯éåæã®çµéšãå¿ èŠããããŸããããASGIã¯å¥œãã§ãããèªåã§ããããšæã£ãããšã¯äžåºŠããããŸããã§ããã
ãã®éã«ãQuartã®äœè
ã§ãã@pgjonesã¯ãWerkzeugã«ããæ·±ãé¢äžããããã«ãªããŸããã Quartã¯çŸåšãå¯èœãªéãèå°è£ã§Werkzeugã䜿çšããŠãããç§ãã¡ã¯ãããéçºãç¶ããŠããŸãã ASGIã䜿çšããããšã«ã€ããŠFlaskã®ã¡ã³ããããã®åçºããã£ããããPhilã¯ãã¬ãã/ flaskïŒ3412ãäœæããŸãããããã«ãããå°ãªããšãasync def
é¢æ°ãžã®ã«ãŒãã£ã³ã°ãå¯èœã«ãªããŸãããããã¯ãã°ããã®éç¶ããŠããŸãã ãã®æç¹ã§ãç§ã¯ãããåãå
¥ãããããASGIã«è¡ããããšæããŸãã @ edk0ã¯ãsans-ioã解æãããã©ãŒã ãäœæããããã«ïŒ1330ãäœæããŸããããããã座ã£ãŠããã®ã§ãããããæåã«ããå°ãèšèšãšã¬ãã¥ãŒãè¡ãå¿
èŠããããŸãã
ããªãFlaskã¯Djangoããã£ãããšãã§ããªãã®ã§ããïŒããšå°ãããããããŸããã ç§ã¯Djangoã®å éšã®å°é家ã§ã¯ãããŸãããã @ andrewgodwinã¯å°ãåã«ãDjangoã¯å ã WSGIã«é©å¿ããŠããããããããç°¡åãªãïŒãŸã éåžžã«è€éãªïŒæéããããšèª¬æããŸããã WerkzeugãšFlaskãå§ããéåžžã«WSGIäžå¿ã®APIã ãŸããDjangoã¯ããã¬ãããããã¯ããã«å€ãã®ãã«ã¿ã€ã ã®æ³šç®ãšãªãœãŒã¹ãç²åŸããŠããŸãã
ã§ã¯ãããã¯ãã®åé¡ãã©ãã«æ®ãã®ã§ããããïŒ Werkzeugã䜿çšããFlaskäºæã®ãã¬ãŒã ã¯ãŒã¯ãå¿ èŠãªå Žåã¯ãQuartã䜿çšããŠãã ããã QuartïŒãŸãã¯FlaskïŒã«è²¢ç®ããŠãäžè¶³ããŠããAPIãšã®äºææ§ãé«ããŸãã WerkzeugãšFlaskã§ASGIããµããŒãããå Žåã¯ãã¹ãããã¢ããããå¿ èŠããããŸãã ASGIã«ã€ããŠåŠã³å§ããŸãã Werkzeugã®APIã®WSGIåºæã®ãããã¯éšåã®ç¹å®ãéå§ããŸãã WSGIãšASGIã®äž¡æ¹ã®å®è£ ãå¯èœã«ããããã«äœæã§ããæœè±¡åã«ã€ããŠèãå§ããŸãã 次ã«ããã®èª¿æ»ããã®ãã£ã¹ã«ãã·ã§ã³ã«æ»ããPRã®èšèšãšäœæãéå§ã§ããããã«ããŸãã
ã¯ã©ãŒãã®ææ¡ãããããšããç§ã¯ããã«è²¢ç®ãåãå ¥ããããšãéåžžã«å¬ããæããŸãã
ãã®èšäºã§Djangoãè¡ã£ãããšãFlaskãå®è¡ã§ããªããšæãçç±ã«çããããšããŸããã æçµçã«ã¯ãpallets / flaskïŒ3412ãFlaskã®æè¯ã®ãœãªã¥ãŒã·ã§ã³ã ãšæããŸãã
Werkzeugã«é¢ããŠã¯ãASGIã¯å¯èœã ãšæããŸãããå€å°ã®èŠçã¯ãããŸãã çã¿ã®æ³šç®ãã¹ãäŸã¯ãWerkzeugã®å€ãã®ãã®ãWSGIåŒã³åºãå¯èœãªããžã§ã¯ãïŒäŸå€ãªã©ïŒã§ãããšããããšã§ãã ASGIã§ã¯ããã®æ©èœãã©ã®ããã«äœ¿çšã§ãããããŸãã¯äœ¿çšããå¿ èŠãããããæ確ã§ã¯ãªããããåé€ããããšæããŸãã
ç§ã®èšç»ã¯ãWerkzeugãQuartã«çµ±åãç¶ããWerkzeugãASGIïŒsans-ioïŒã«åããŠèª¿æŽããããšã§ãïŒåãå ¥ããããéãïŒ-ç§ã®å¯äžã®é害ã¯æéã®äžè¶³ã§ãã
æãåèã«ãªãã³ã¡ã³ã
ã¯ããWerkzeugãšFlaskã¯æçµçã«ASGIããµããŒãããŸãã ç§ã«ã¯ããã®ã¿ã€ã ã©ã€ã³ããããŸãããã誰ããPRãéå§ããå Žåã¯ãPRã®ã¬ãã¥ãŒãåãã§ãæäŒãããŸãã
ãã ãããããå®è£ ããã®ã¯ç§ã§ã¯ãããŸãããã³ãã¥ããã£ã®æ¯æŽãå¿ èŠã§ãã 以äžã®ææ°ã®æŽæ°ãåç §ããŠãã ããïŒ https ïŒ//github.com/pallets/werkzeug/issues/1322#issuecomment -600926145