2012-04-27 18 views
1

私はそれぞれのリクエストの前に条件をチェックし、異なるビューを呼びたいと思います。 これはどのように達成されましたか?私は考えることができるPyramidの各ビューに条件付きリダイレクトを追加するにはどうすればよいですか?

一つの解決策は、NewRequestを加入者に何かを追加しているが、私は立ち往生しています:

@subscriber(NewRequest) 
def new_request_subscriber(event): 
    if condition: 
    #what now? 

答えて

1

さて、あなたが与えてくれました「条件」または「異なるビューを呼び出す」という意味の情報はほとんどないので、リダイレクトを呼びたくないと仮定しますが、代わりにアプリケーションが別のURLが要求されていると思うようにします。これを行うには、pyramid_rewriteを参照してください。これは、これらのものには非常に便利です。または、NewRequestサブスクライバ内のリクエストのパスを変更することもできます。ピラミッドがビューにディスパッチする前に呼び出されるからです。

if request.path == '/foo': 
    request.path = '/bar': 

config.add_route('foo', '/foo') # never matches 
config.add_route('bar', '/bar') 
+0

私はいつも(任意のURLに対して)sign_inページを表示したいと仮定します。ユーザがsign_outの場合 request.pathは変更不可bacuase私には: *** AttributeError:属性を設定できません – xliiv

+0

申し訳ありません、それは 'request.path_info '、更新された答え。このようにページを表示できますが、その場合は、@rajが示した 'raise HTTPFound'メソッドを使用してリダイレクトするか、Pyramidの認証システムを使って自動的に処理します。 –

+0

@Rajの解決策が私の場合には最高だと思います。皆さんありがとう。 – xliiv

1

しかし、「状態を確認...と異なる見解を呼び出す」する別のオプションは、カスタムビューを使用することですCris McDonough's blog postから

を述語:

def example_dot_com_host(info, request): 
     if request.host == 'www.example.com: 
      return True 

がカスタム述語だこと。ホスト名がwww.example.comの場合はTrueを返します。ここでは、我々はそれを使用する方法は次のとおりです。ただし

@view_config(route_name='blogentry', request_method='GET') 
    def get_blogentry(request): 
     ... 

    @view_config(route_name='blogentry', request_method='POST') 
    def post_blogentry(request): 
     ... 

    @view_config(route_name='blogentry', request_method='GET', 
       custom_predicates=(example_dot_com_host,)) 
    def get_blogentry_example_com(request): 
     ... 

    @view_config(route_name='blogentry', request_method='POST', 
       custom_predicates=(example_dot_com_host,)) 
    def post_blogentry_example_com(request): 
     ... 

、あなたの特定の問題のために(ユーザーがページを閲覧する権限を持っていない場合はページ内の記号を表示)これを達成するためのより良い方法は以下のようになりset up permissionsにビューのためにそう枠組みは、ユーザーに許可がない場合は例外が発生し、custom view for that exceptionを登録すると、サインインフォームが表示されます。

+0

クールなもの私はそれを知らなかったと私は多くを学んだ、これは私のすべてのビューを変更する必要がありますので、これは私のための完璧な解決策ではありませんが、ありがとう。 :) – xliiv

関連する問題