2014-11-20 2 views
0

피라미드 구성자에서 내 라이브러리를 가져 오는 응용 프로그램이 특정 기본값으로 특정 라우트에 연결된 뷰를 추가 할 수있게하는 지시문을 만들려고합니다. 합니다 (pyramid docs에 주어진 예제 떨어져 모델)피라미드에서 지시문과 동작을 사용하여 뷰 추가하기

내 첫 번째 시도는 :

def status_view_directive(config, view, **view_config_kwargs): 
    def register_status_view(): 
     config.add_view(
      view=view, 
      route_name='status', 
      **view_config_kwargs 
     ) 
    config.action('a_discriminator', register_status_view) 

if __name__ == '__main__': 
    config = Configurator() 
    config.add_route('status', '/status') 
    config.add_directive('add_status_view', status_view_directive) 
    config.add_status_view('some_view', **some_kwargs) 
    return config.make_wsgi_app() 

이 작동하지 않습니다. 보기에 액세스하려고 할 때마다 404이 다시 나타납니다. 내가 다음에 코드를 수정하는 경우

, 그것은 예상대로 작동합니다

def status_view_directive(config, view, **view_config_kwargs): 
    config.add_view(
     view=view, 
     route_name='status', 
     **view_config_kwargs 
    ) 

if __name__ == '__main__': 
    config = Configurator() 
    config.add_route('status', '/status') 
    config.add_directive('add_status_view', status_view_directive) 
    config.add_status_view('some_view', **some_kwargs) 
    return config.make_wsgi_app() 

난 그냥이를 알아 내려고 몇 시간을 잃었다. 누구나 왜 첫 번째 스 니펫이 작동하지 않는지 알고 있습니까?

답변

1

이 일어나고있는 것입니다 : 당신의 지시를 호출 할 때

  • register_status_view 작업이 등록됩니다.

  • 피라미드가 작업을 실행하면이 작업이 실행됩니다.

  • 그러나이 동작은 자체적으로 동작을 등록하는 지시문을 호출합니다. 그러나 액션 실행은 재귀가 아닙니다. 액션 실행의 결과로 등록 된 액션은 바닥에 떨어집니다.

향후 출시 될 피라미드 버전에서이 문제를 해결할 계획이 있습니다. 그러나 지금은 아마 대신 다음과 같이 할 수 있습니다.

def status_view_directive(config, view, **view_config_kwargs): 
    config.add_view(
     view=view, 
     route_name='status', 
     **view_config_kwargs 
     ) 
관련 문제