2017-05-27 12 views
1

私のフラスコプロジェクトでflask extension(これはかなり動作するので)を使わないでpy2neoを使用しています。
私がしようとしているのは、アプリケーションのコンテキストでデータベース接続を保持することです(リクエスト処理全体で保持されるため)。Flaskのアプリケーションコンテキストでpy2neo接続を維持する

フラスコのマニュアルに基づいて、私は次のコードをしている:

def get_neo4j(): 
    with app.app_context(): 
     neo4j = getattr(g, '_neo4j', None) 
     if neo4j is None: 
      connection_string = http blah blah blah 
      neo4j = g._neo4j = Graph(connection_string) 
     return neo4j 

は、これは正しいですか? werkzeugのローカルプロキシの恩恵を受けるために上記のコードを編集するにはどうすればよいですか?

答えて

0

[OK]を、 はextensionsにフラスコのマニュアルを読んだ後、生きている、接続を維持するために自分自身のクラスを開発するために簡単だった:

from py2neo import Graph 
from flask import current_app 

try: 
    from flask import _app_ctx_stack as stack 
except ImportError: 
    from flask import _request_ctx_stack as stack 


class Neo4jConnection(object): 

    def __init__(self, app=None): 
     self.app = app 
     if app is not None: 
      self.init_app(app) 

    def init_app(self, app): 
     if hasattr(app, 'teardown_appcontext'): 
      app.teardown_appcontext(self.teardown) 
     else: 
      app.teardown_request(self.teardown) 

    def connect(self): 
     # Read configuations from app config 
     return Graph(bolt=True, 
        host=current_app.config['NEO4J_SERVER_ADDRESS'], 
        bolt_port=current_app.config['NEO4J_PORT'], 
        user=current_app.config['NEO4J_USER'], 
        password=current_app.config['NEO4J_PASSWORD'],) 

    def teardown(self, exception): 
     ctx = stack.top 
     if hasattr(ctx, 'neo4j_db'): 
      ctx.neo4j_db = None 

    @property 
    def connection(self): 
     ctx = stack.top 
     if ctx is not None: 
      if not hasattr(ctx, 'neo4j_db'): 
       ctx.neo4j_db = self.connect() 
      return ctx.neo4j_db 

は、今では働い取得するファクトリパターンを使用します。

初期化:

neo4j = Neo4jConnection() 
neo4j.init_app(app) 

使用法:

myneo = Neo4jConnection().connection 
myneo.push(.....) 

私はそれをテストしました。それが正しいことを願っています。

関連する問題