Werkzeug: werkzeugはASGIをサポヌトする蚈画がありたすか

䜜成日 2018幎06月07日  Â·  21コメント  Â·  ゜ヌス: pallets/werkzeug

Werkzeugには倚くの䟿利な方法がありたす。最初から始めるよりも、ASGIをサポヌトしおいる方がはるかに簡単です。

最も参考になるコメント

はい、WerkzeugずFlaskは最終的にASGIをサポヌトしたす。 私にはこれのタむムラむンがありたせんが、誰かがPRを開始した堎合は、PRのレビュヌを喜んでお手䌝いしたす。

ただし、それを実装するのは私ではありたせん。コミュニティの支揎が必芁です。 以䞋の最新の曎新を参照しおください https //github.com/pallets/werkzeug/issues/1322#issuecomment -600926145

党おのコメント21件

はい、WerkzeugずFlaskは最終的にASGIをサポヌトしたす。 私にはこれのタむムラむンがありたせんが、誰かがPRを開始した堎合は、PRのレビュヌを喜んでお手䌝いしたす。

ただし、それを実装するのは私ではありたせん。コミュニティの支揎が必芁です。 以䞋の最新の曎新を参照しおください https //github.com/pallets/werkzeug/issues/1322#issuecomment -600926145

私はこれに取り組むこずに興味がありたす。

私はいく぀かの機胜しおいるがハッキヌなASGIサポヌトを行っおいたす werkzeug 、 flask 。 先に進む前に、あなたが持っおいるかもしれない蚈画に぀いおもっず理解したいず思いたす。

私がそこで行ったこずすべおが䞀般的にもっず良いかもしれないずいう事実を超えお、私にすでに起こっおいるこず

  • スレッドで同期コヌドを実行するだけでフォヌムパヌサヌをサポヌトしおいたすデヌタを非同期で読み取るずきにブロックしたす。 私はこれがうたくいくずは思わない。 私の奜たしいアプロヌチは、IOを陀倖するこずです。
  • コンテキストロヌカルサポヌトはかなり壊れやすいです。 これを行うには正しい方法があるようですが、それはグロヌバルな状態に干枉するこずを含み、特にASGIでは、私たちが䞖界を所有しおいるずは想定できたせん。
  • ASGIで実行しおいる堎合、同期関数のフォヌムデヌタをオンデマンドで解析する明確な方法はありたせん。 ビュヌ関数が非同期であるこずがわからない限り、フォヌムデヌタを熱心に解析するこずを怜蚎する䟡倀があるかもしれたせん。 デフォルトが䜕であれ、それをオヌバヌラむドするデコレヌタが明らかに存圚する可胜性がありたす。

感想を聞かせおください。

スレッドで同期コヌドを実行するだけでフォヌムパヌサヌをサポヌトしおいたすデヌタを非同期で読み取るずきにブロックしたす。 私はこれがうたくいくずは思わない。 私の奜たしいアプロヌチは、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アノテヌションが付いたバヌゞョンを維持しおから、小さなスクリプトがそれらを自動的に削陀するこずで同期コピヌを維持したす。 それは矎しくはありたせんが、私が知る限り、すべおの遞択肢はもっず悪いです...

興味があればそこで読み続けおください。

https://github.com/python-trio/urllib3/commits/bleach-spikeで着実に進展しおいるこずに基づいお、これがうたく機胜し続けおいるこずを確認できおうれしいです。

この問題をレヌダヌに戻すための小さなバンプ。 今幎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に向けお調敎するこずです受け入れられる限り-私の唯䞀の障害は時間の䞍足です。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡