0

私はdjangoにview関数を持っています。これは、request.GETの変数に応じて、ディスパッチャーが他の関数を呼び出すように記述されています。

action = ''
    for act in ('view1', 'view2', 'view3', 'view4', ... ):
        if act in request.GET:
            action = act
            break
...
if action == '':
    response = view0(request, ...)
elif action == 'view1':
    response = view1(request, ...)
elif action == 'view2':
    response = view2(request, ...)
...

グローバルディスパッチャー関数には多くの変数初期化ルーチンが含まれており、これらの変数はviewXX関数で使用されます。また、一部の初期化コードは、呼び出されているアクションによって異なります。

だから私はこれが悪いビューデザインであることをフィードしますが、どうやってそれを書き直すことができるのか分かりませんか?

4

3 に答える 3

3

http://mysite.com/path/to/url?action=view0にリクエストを送信し、次のようなurlpatternsを使用する代わりに:

urlpatterns = patterns('', 
    (r'^/path/to/url', 'myapp.views.dispatch'),
)

http://mysite.com/path/to/url/view0にリクエストを送信し、次のようなurlpatternsを使用できます。

urlpatterns = patterns('', 
    (r'^/path/to/url/view0', 'myapp.views.view0'),
    (r'^/path/to/url/view1', 'myapp.views.view1'),
    (r'^/path/to/url/view2', 'myapp.views.view2'),
    ...
)

次に、各サブビューで関数を呼び出してinitialize、共通の変数を取得します。

これが悪いデザインであるかどうかは、あなたが何をしているかに依存します。場合によっては、すべてを分割するよりも、ディスパッチャを使用する方が理にかなっています。

于 2010-04-02T18:58:07.967 に答える
1

はるかに優れた解決策は、ミドルウェアを使用することです。process_viewミドルウェアクラスは、ビューが実行される直前に呼び出され、パラメーターとして呼び出されるビュー関数が渡されます。ミドルウェアは、HttpResponse自体を返すことによってプロセスを短絡するか、ビューを正常に呼び出すために何も返さないかのいずれかです。

したがって、URLconfでURLを通常どおりに定義できますが、ミドルウェアでの呼び出しをインターセプトしてそこで初期化を行い、関連するビューを手動で呼び出して、ミドルウェアから直接応答を返します。

于 2010-04-02T19:40:20.870 に答える
1

ディスパッチディクテーションが必要です。

actions = {
  '': view0,
  'view1': view1,
  ...
}

response = actions[action](request, ...)

これには、関数のシグネチャが同じであるか、andを使用する必要が*あり**ます。

于 2010-04-02T19:41:44.783 に答える