2010-04-02 3 views
0

보기 기능 장고 :내가이 같은 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 함수에서 사용됩니다. 또한 일부 초기화 코드는 호출되는 작업에 따라 다릅니다.

그래서 내가보기에는 좋지 않은 디자인이지만, 어떻게 다시 쓸 수 있을지 모르겠다.

답변

3

대신 다음과 같이 urlpatterns을 http://mysite.com/path/to/url?action=view0에 요청을 보내고 사용하는 :

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 함수를 호출하여 공통 변수를 가져옵니다.

이 디자인이 나쁜지 여부는 현재 수행중인 작업에 따라 다릅니다. 어떤 경우에는 디스패처를 갖는 것이 모든 것을 나누는 것보다 더 합리적입니다.

+0

세스에게 고맙습니다 만, 초기화 절차가 동작에 따라 약간 다를 경우 어떻게해야합니까? – dragoon

+0

그런 경우 초기화의 공통 요소를 하나의 함수로 제외하고 각 하위 뷰의 고유 요소를 유지할 수 있습니다. 또는 초기화 함수를 매개 변수화하십시오. 세부 사항에 따라 다릅니다. – Seth

1

더 나은 솔루션은 미들웨어를 사용하는 것입니다. process_view 미들웨어 클래스는 뷰가 실행되기 바로 전에 호출되며 매개 변수로 호출 할 뷰 함수에 전달됩니다. 미들웨어는 HttpResponse 자체를 반환하여 프로세스를 단락 시키거나 아무 것도 반환하지 않아 뷰를 정상적으로 호출 할 수 있습니다.

URLconf에서 정상적으로 URL을 정의 할 수 있지만 미들웨어의 호출을 가로 채고 거기에서 초기화를 수행하고 관련 뷰를 수동으로 호출 한 다음 미들웨어에서 직접 응답을 반환합니다.

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

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

이것은 동일 또는 ***를 사용하는 함수 서명이 필요합니다

1

당신은 디스패치 딕셔너리를 원한다.

+0

디스패처 디자인에 충실하게 해주시면 감사하겠습니다. – dragoon

관련 문제