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 回答