2010-04-02 64 views
0

我有寫的調度程序調用取決於在request.GET中可變等功能,這樣在Django視圖功能:Django的視圖功能設計

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函數中使用。還有一些初始化代碼取決於正在調用什麼操作。

因此,我認爲這是糟糕的視圖設計,但我不知道如何重寫它?

回答

3

而是將請求發送到http://mysite.com/path/to/url?action=view0和使用URL模式是這樣的:

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

你可以把你的要求http://mysite.com/path/to/url/view0,並使用URL模式是這樣的:

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函數來獲取公共變量。

這是否是不好的設計取決於你在做什麼。在某些情況下,擁有調度員比將所有事情分開更有意義。

+0

謝謝Seth,但是如果初始化過程根據操作而有所不同,那該怎麼辦呢? – dragoon 2010-04-02 19:19:24

+0

在這種情況下,可以將初始化的常見元素分解爲一個函數,並在每個子視圖中保留唯一元素。或者,參數化你的初始化函數。取決於具體情況。 – Seth 2010-04-02 19:47:27

1

更好的解決方案是使用中間件。在執行視圖之前調用process_view中間件類,並傳遞視圖函數作爲參數調用。中間件可以通過返回一個HttpResponse本身來使進程短路,或者不返回任何東西來讓視圖正常調用。

因此,您可以像常規那樣在URLconf中定義您的URL,但是攔截中間件中的調用並在那裏進行初始化,手動調用相關視圖並直接從中間件返回響應。

1

你想要一個調度字典:

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

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

這需要函數簽名是相同的,或使用***

+0

謝謝,如果我堅持調度程序設計,這將是非常好的解決方案 – dragoon 2010-04-02 19:56:16