많은 컨트롤러 (하위보기)에 대한 하나의보기 (앞 페이지)


1

참고 : 자바 스크립트 또는 iframe을 사용할 수 없습니다. 사실 나는 클라이언트 브라우저가 울트라 베이직에 대해서만 할 수 있다고 믿을 수 없다.

저는 현재 Pylon의 프레임 워크에 중점을 둔 대부분의 연구와 함께 기존 PHP4 응용 프로그램을 MVC 응용 프로그램으로 재 구축하고 있습니다.

내가 처음 실행 한 이상한 문제 중 하나는 iframe을 사용하거나 더 나은 자바 스크립트를 사용하여 해결했습니다. 일반적인 컨트롤러 색인의 다이제스트보기와 같은 동적 위젯을 표시합니다 전망.

내 문제를 시각화하는 가장 좋은 방법은 Google의 개인화 된 홈페이지를 보는 것입니다. 그들은 자바 스크립트로 문제를 해결하지만 내 시나리오에서 자바 스크립트와 거의 모든 기본적인 XHTML 위의 것은 불가능합니다.

내가 시작한 한 가지 아이디어는 FrontPage 컨트롤러가 현재 활성화 된 위젯에 대한 데이터베이스 또는 다른 서비스를 폴링 한 다음 튜플/사전 목록을 가져 와서 각 컨트롤러를 동적으로 인스턴스화하고 목록의 하위 목록을 작성하는 것입니다. -views를 프론트 페이지보기로 전달하고 상황을 파악하게합니다. 그래서 peusudo 코드

: subRender에 대한

Get request goes to WSGI 
WSGI calls pylons 
Pylons routes to Frontpage.index() 
Frontpage.index() 
    myViews = list() 
    for WidgetController in ActiveWidegets(): 
     myViews.append(subRender(WidgetController, widgetView)) 

c.subviews = myViews 
render(frontpage.mako) 

이상한 비트

  • 동적
  • 가 매우 비싼 될 수있는 잠재력을 가지고있다 (현재 프로젝트의 네임 스페이스 :(하드 코드) __import__를 통해 컨트롤러를 가져옵니다 (대부분의 위젯 호출은 캐싱 할 수 있지만 사용자 패널 하나임)

WSGI 나 더 나은 Pylons에서 이미 구현 된 메커니즘이 더 좋은 방법이 될 것 같습니다. 그러나 지금까지 가장 가까운 방법은이 유틸리티 메소드입니다 : http://www.pylonshq.com/docs/en/0.9.7/modules/controllers_util/#pylons.controllers.util.forward하지만 약간 미친 것처럼 보입니다. N의 파일런을 만들어 콜론 뷰를 얻습니다.

  0

@S. Lott 고마워, 내가 처음 제출했을 때 그것이 나쁘게 렌더링되었다는 것을 깨닫지 못했다. 22 feb. 092009-02-22 03:33:02

6

대부분의 경우 나는 각기 다른 위젯을로드하기 위해 Javascript를 사용하여 원래 지정한 것을 권하고 싶습니다. 옵션이 아니기 때문에 조금 다른 것을해야 할 것입니다.

하나의 프론트 컨트롤러가 필요한 모든 위젯을 실행하고 빌드하는 방법을 사용하는 것 외에도 Mako의 템플릿을보다 강력하게 사용하는 방법을 고려해 볼 수 있습니다.

실제로 Mako def로 작은 블록을 정의 할 수 있습니다. 물론 이것은 완전한 Python 능력을 가지고 있습니다. Mako 템플릿을 도메인 로직으로 오염시키지 않으려면 모든 것을 모델에 보관하고 페이지 구성 요소에 필요한 Mako def의 모델 인스턴스를 호출해야합니다.

이 접근법의 큰 이점은 Mako def의 지원 캐시 args 이후 실제로 페이지 구성 요소가 캐시하는 방법을 결정할 수 있다는 것입니다.어쩌면 사이드 바를 5 분 동안 캐시해야하지만, 예를 들어 상단 바는 모든 히트를 변경합니다. 또한 구성 요소가 db 히트를 트리거하므로 구성 요소가 캐시 할 때 db 히트를 저장합니다.

ToscaWidgets는 성능이 뛰어나서 대규모로 구현할 수있는 기능이 없으므로 사용하지 않아도됩니다.

기존 아이디어에 대한 몇 가지 조정 사항으로, 위젯 페이지를 만들 필요가없는 WSGI를 지원하는 데 필요한만큼 Pylons 컨트롤러를 실제로 사용하지 않도록하십시오.

class Widget(object): 
    def process(self): 
     # Determine if this widget should process a POST aimed at it 
     # ie, one of the POST args is a widget id indicating the widget 
     # to handle the POST 

    def prepare(self): 
     # Load data from the database if needed in prep for the render 

    def render(self): 
     # return the rendered content 

    def __call__(self): 
     self.process() 
     self.prepare() 
     return self.render() 

가 그럼 그냥 위젯 인스턴스를 통해 주요 마코 템플릿으로 반복 있고, 그들을 렌더링하도록 전화 :

나는 모든 위젯 클래스과 같이 일을 고려해 것입니다.


0

위젯을 캡슐화하려면 ToscaWidgets을 사용하고 각 사용자 (데이터베이스 또는 다른 서비스에서 권장하는대로)에 사용할 수있는 위젯 목록을 저장하십시오. 사용 가능한 ToscaWidgets의 목록을보기에 전달하면 위젯에 직접 리소스가 필요한 경우 페이지에 CSS/JavaScript 참조를 동적으로 추가하는 등 위젯 자체가 렌더링됩니다.

  0

@Chris - 저는 최근에 실제로 Tosca를 조사하기 시작했습니다. 저는 이것이 양식 작성 도구 였거나 잘못된 것이라고 생각하고 있었습니까? 17 mar. 092009-03-17 16:33:37

  0

@David - 아니요, tw.forms에 많은 폼 기반 위젯을 제공하지만 양식 특정하지 않습니다. TW 자체는 재사용 가능한 모든 UI 구성 요소를 래핑 할 수있는 "위젯"캡슐화 라이브러리입니다. 문서 도구로 인해이를 분명하게 알 수 없습니다. 01 apr. 092009-04-01 00:14:31