2017-05-26 10 views
0

私の問題は私がピラミッドプロジェクトを構成する方法に関連していると思います。 私が達成したいのは、すべてのビューでコードを実行することです。すべてのビューに同じコードを貼り付ける必要はありません。そのように私は、単純に呼び出すだけで、すべてのビューにコードを含めます。これは私のコードです。ピラミッドのすべてのビューにセッションコードを入れずにすべてのページにセッションを入れる方法は?

私のウィザードモジュール

from pyramid.view import view_config, view_defaults 
from .models import * 
from datetime import datetime 
from pyramid.response import Response 
from bson import ObjectId 
from pyramid.httpexceptions import HTTPFound 
import json 

class WizardView: 

def __init__(self, request): 
    self.request = request 

@view_config(route_name='wizard', renderer='templates/wizard.jinja2') 
def wizard(self): 
    session = self.request.session 
    if session: 
     return {'fullname':session['name'],'userrole':session['userrole']} 
    else: 
     url = self.request.route_url('login') 
     return HTTPFound(location=url) 

私の法案モジュール

from pyramid.view import view_config, view_defaults 
from .models import * 
from datetime import datetime 
from pyramid.response import Response 
from bson import ObjectId 
from pyramid.httpexceptions import HTTPFound 

class BillView: 

def __init__(self, request): 
    self.request = request 

@view_config(route_name='bills', renderer='templates/bills.jinja2') 
def bills(self): 
    session = self.request.session 
    if session: 
     return {'fullname':session['name'],'userrole':session['userrole']} 
    else: 
     url = self.request.route_url('login') 
     return HTTPFound(location=url) 

あなたは、私は二回、このコードを貼り付けする必要が見ることができるようにセッションが存在する場合(このコードのチェックは、そうでない場合は、その後にユーザーをリダイレクトログインページ)

session = self.request.session 
if session: 
    return {'fullname':session['name'],'userrole':session['userrole']} 
else: 
    url = self.request.route_url('login') 
    return HTTPFound(location=url) 

私は検索しようとしましたが、私が必要と思うのは何らかのオートロアダマー?これをピラミッドにどのように適用できますか?または、私はこのプロセスに固執すべきですか?

答えて

1

両方(多くの)ビューからまったく同じものを返す場合は、継承を使用するのが最善の方法です。

class GenericView: 
    def __init__(self, request): 
    self.request = request 

    def generic_response(self): 
     session = self.request.session 
     if session: 
      return {'fullname':session['name'],'userrole':session['userrole']} 
     else: 
      url = self.request.route_url('login') 
      return HTTPFound(location=url) 

WizardViewで使用generic_responseBillView

class WizardView(GenericView): 

    def __init__(self, request): 
     super().__init__(request) 
     # Do wizard specific initialization 

    @view_config(route_name='wizard', renderer='templates/wizard.jinja2') 
    def wizard(self): 
     return self.generic_response() 

class BillView(GenericView): 

    def __init__(self, request): 
     super().__init__(request) 
     # Do bill specific initialization 

    @view_config(route_name='bills', renderer='templates/bills.jinja2') 
    def bills(self): 
     return self.generic_response() 

あなただけのチェック(およびリダイレクト)したい場合はセッションが存在し、それ以外の場合は、カスタム例外とそれに対応するビューを使用することができます正常に進まないとき。

@view_config(context=SessionNotPresent) 
def handle_no_session(context, request): 
    # context is our custom exception, request is normal request 
    request.route_url('login') 
    return HTTPFound(location=url) 

セッションが親コンストラクタに存在するかどうそれからちょうどチェックビューで

class SessionView: 
    def __init__(self, request): 
     self.request = request 
     if not self.request.session: 
      raise SessionNotPresent() # Pyramid will delegate request handilng to handle_no_request 

単にSessionViewと非を拡張まず、この例外のカスタム例外

class SessionNotPresent(Exception): 
    pass 

とビュー定義既存のセッションはhandle_no_sessionによってハンドリングされます。あなたは簡単に例外処理の例外に(redirect_url、...)

を追加パラメータを追加することができ

class WizardView(SessionView): 

    def __init__(self, request): 
     super().__init__(request) 
     # Do wizard specific initialization 

    @view_config(route_name='wizard', renderer='templates/wizard.jinja2') 
    def wizard(self): 
     session = self.request.session 
     return {'fullname':session['name'],'userrole':session['userrole']} 


class BillView(SessionView): 

    def __init__(self, request): 
     super().__init__(request) 
     # Do bill specific initialization 

    @view_config(route_name='bills', renderer='templates/bills.jinja2') 
    def bills(self): 
     session = self.request.session 
     return {'fullname':session['name'],'userrole':session['userrole']} 

http://docs.pylonsproject.org/projects/pyramid-cookbook/en/latest/pylons/exceptions.html

関連する問題