2016-08-10 13 views
7

Tôi tự hỏi nơi tốt nhất sẽ là tạo một phiên scoped để sử dụng trong falcon.SQLAlchemy và Falcon - khởi tạo phiên

Từ đọc mã bình-SQLAlchemy, nó, trong một vòng khoảng cách, làm điều gì đó như thế này:

from sqlalchemy import create_engine 
from sqlalchemy.orm import scoped_session, sessionmaker 

try: 
    from greenlet import get_current as get_ident 
except ImportError: 
    try: 
     from thread import get_ident 
    except ImportError: 
     from _thread import get_ident 

connection_uri = 'postgresql://postgres:@localhost:5432/db' 
engine = create_engine(connection_uri) 
session_factory = sessionmaker(bind=engine) 
session_cls = scoped_session(session_factory, scopefunc=get_ident) 
session = session_cls() 

tác phẩm này với ưng Sẽ? get_ident func "làm điều đúng" khi sử dụng gunicorn?

Trả lời

10

Bạn có thể sử dụng middleware

Ví dụ.

  1. Tạo đối tượng engine, session_factory và scoped_session.

    from sqlalchemy import create_engine 
    from sqlalchemy.orm import scoped_session 
    from sqlalchemy.orm import sessionmaker 
    
    import settings 
    
    
    engine = create_engine(
        '{engine}://{username}:{password}@{host}:{port}/{db_name}'.format(
        **settings.POSTGRESQL 
        ) 
    ) 
    
    session_factory = sessionmaker(bind=engine) 
    Session = scoped_session(session_factory) 
    
  2. Tạo phần mềm trung gian.

    class SQLAlchemySessionManager: 
        """ 
        Create a scoped session for every request and close it when the request 
        ends. 
        """ 
    
        def __init__(self, Session): 
         self.Session = Session 
    
        def process_resource(self, req, resp, resource, params): 
         resource.session = self.Session() 
    
        def process_response(self, req, resp, resource, req_succeeded): 
         if hasattr(resource, 'session'): 
          Session.remove() 
    
  3. Đăng ký phần mềm trung gian.

    import falcon 
    
    
    app = falcon.API(middleware=[ 
        SQLAlchemySessionManager(Session), 
    ]) 
    
  4. Phiên có thể truy cập trong mọi yêu cầu.

    import falcon 
    
    
    class MyAPI: 
    
        def on_get(self, req, resp): 
         # You can access self.session here 
         # self.session.add(foo) 
         # self.session.commit() 
    
+0

Điều này thực sự hữu ích. Một câu hỏi nhanh, đó có phải là 'resource.session.close()' hay 'resource.session.remove()'? – misakm

+2

Không, nó phải là 'Session.remove()' theo http://docs.sqlalchemy.org/en/rel_1_1/orm/contextual.html#using-thread-local-scope-with-web-applications. –

Các vấn đề liên quan