10

Python Webフレームワークがリクエストの処理を処理する主な方法は、デコレータ、個々のリクエストのメソッドを持つコントローラークラス、GET/POSTのメソッドを持つリクエストクラスの3つです。

私はこれらの3つのアプローチの長所に興味があります。これらのアプローチのいずれかに大きな長所または短所がありますか?アイデアを修正するために、ここに3つの例があります。

ボトルはデコレータを使用します:

@route('/')
def index():
    return 'Hello World!'

Pylonsはコントローラークラスを使用します。

class HelloController(BaseController):
    def index(self):
        return 'Hello World'

Tornadoは、タイプのメソッドを持つリクエストハンドラクラスを使用します。

 class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

どのスタイルがベストプラクティスですか?

4

2 に答える 2

10

実際には、各プロジェクトに固有の、リストした3つの方法のそれぞれに理由があります。

  • ボトルは、プログラマーにとって可能な限り単純/単純なものを維持しようとします。ルート用のデコレータを使用すると、開発者がOOPを理解することを心配する必要はありません。
  • Pylonsの開発目標は、コードを再利用可能にし、WSGIスタイルのHTTPプロセスルーティングと簡単に統合できるようにすることです。そのため、彼らはルートを整理するための非常にOOPな方法を選択しました。例として、HelloControllerを任意のPylonsアプリにコピーして貼り付けることができ、魔法のように機能するはずです。上記のアプリがWSGIを介して複雑な方法で提供されている場合でも。
  • Tornadoには、それと同じように動作するもう1つの理由があります。TornadoのepollベースのIOLoop(tornado.web.Applicationと組み合わせて)は、リクエストが着信すると各RequestHandlerをインスタンス化します。各RequestHandlerを特定のGETまたはPOSTに制限することで、IOLoopが可能になります。クラスをすばやくインスタンス化し、リクエストを処理し、最後にガベージコレクションを取得します。これにより、アプリケーションのRequestHandlerの数に関係なく、メモリフットプリントが小さく、高速かつ効率的に維持されます。これは、Tornadoが他のPythonベースのWebサーバーよりもはるかに多くの同時リクエストを処理できる理由でもあります(各リクエストは独自のインスタンスを取得します)。

さて、すべてのことを言ったので、デフォルトのフレームワークの動作をいつでもオーバーライドできることを知っておく必要があります。たとえば、Tornado用のMethodDispatcherを作成して、Pylonsのように機能させました(作成したときはCherryPyを念頭に置いていました)。大きなRequestHandlerが1つあるため(小さなものがたくさんあるのではなく)、Tornadoの速度が少し遅くなります(メモリフットプリントがわずかに増えます)が、アプリ内のコードの量が減り、読みやすくなります。 (私の偏った意見では、もちろん=)。

于 2010-06-06T18:05:56.397 に答える
1

さまざまなフレームワークが、最高のコード(書き込みおよび読み取り用)を通じて最高のパフォーマンスを達成しようとしています。それらはそれぞれ、MVCまたはMVTに基づいて、またはその周辺で異なる戦略を採用しています。

あなたが焦点を当てているのは、おそらく個人的な好みに帰着するでしょう。そして、私の答えもそうです。私は、私が知らない有効な技術的議論があるかもしれないので、どんな種類の聖戦も避けるために非常に一生懸命に努力しています。

しかし、私は個人的に、ルーティングをコントローラー(djangoのビュー)から分離し、テンプレートをコントローラーから分離することを好みます。これにより、コントローラーの再利用が非常に簡単になります。ええ、私はDjangoユーザーです。

そのため、私は実際には、Bottleのデコレータや、大規模な大規模なクラスで物事をラッピングすることの大ファンではありません。私はASP.NET開発者だった頃に使用していましたが、Djangoによって解放されました。

于 2010-06-06T17:21:49.603 に答える