2011-10-23 4 views
3

私はこのようになりますピラミッドでNewRequestイベントハンドラ(加入者)があります。しかしPyramidでは、NewRequestイベントハンドラでビューが静的であるかどうかをチェックする方法は?

@subscriber(NewRequest) 
def new_request_subscriber(event): 
    request = event.request 
    print('Opening DB conn') 
    // Open the DB 
    request.db = my_connect_to_db() 
    request.add_finished_callback(close_db_connection) 

を、私は、DBへの接続が要求される静的な資産になっても、開いていることを観察しました明らかに不要です。 NewRequestハンドラからリクエストが静的資産にバインドされているかどうかを確認する方法はありますか? view_nameと私の静的ビューの名前を比較しようとしましたが、明らかにview_name属性はリクエストの処理のこの初期段階では利用できません。

誰かがこれに関する興味深いアイデアを持っているなら、私に教えてください!

+0

私は通常、これを気にしません。実稼働環境では、アプリケーションの前にあるWebサーバーから静的ファイルを直接提供します。リクエストは決してアプリケーションにヒットしません。 –

答えて

3

変数をrequest.pathと静的ビューのルートa la request.path.startswith('/static/')と比較することができます。

自分のアプリで一番好きな方法は、アクセス時に怠惰に評価されるdbというrequestオブジェクトにプロパティを追加することです。したがって、リクエストに追加することはできますが、アクセスするまで何もしません。

import types 

def get_db_connection(request): 
    if not hasattr(request, '_db'): 
     request._db = my_connect_to_db() 
     request.add_finished_callback(close_db_connection) 
    return request._db 

def new_request_subscriber(event): 
    request = event.request 
    request.db = types.MethodType(get_db_connection, request) 

コードの後に​​request.db()にアクセスして接続できます。残念ながら、実行時にオブジェクトにプロパティを追加することはできません(afaik)ので、設定することができないので、request.dbはあなたに必要なものを与えます。サブクラスRequestをサブクラス化し、Pyramidの@reifyデコレータを使用して独自の遅延プロパティを追加することにより、サブスクライバを使用せずにこの動作を得ることができます。

+0

オハイオ州クール、私は完全にこれを考えなかった! – fyhuang

1
def _connection(request): 
    print "******Create connection***" 
    #conn = request.registry.dbsession() 
    conn = MySQLdb.connect("localhost", "DB_Login_Name", "DB_Password", "data_base_name") 
    def cleanup(_): 
     conn.close() 
    request.add_finished_callback(cleanup) 
    return conn 

@subscriber(NewRequest) 
def new_request_subscriber(event): 
    print "new_request_subscriber" 
    request = event.request 
    request.set_property(_connection, "db", reify = True) 

これを試してみてください、私は休耕たWebページに http://pyramid.readthedocs.org/en/1.3-branch/api/request.html "SET_PROPERTY" セクションを参照して、それが私のために動作します。

関連する問題