如何在socketio方法中获得全局金字塔请求?

问题描述 投票:1回答:1

我想使用python-socketio,我想从socketio方法中查询数据库。我的数据库设置保存在金字塔请求中。但是我不明白如何在没有http请求的情况下获得这些设置。

@sio.event
def connect(sid, environ):
    print('connect ', sid)


@sio.event
def message(sid, data):
    # I want to query my database at this location
    sio.send(data)
    print('Server send', data)


@sio.event
def disconnect(sid):
    print('disconnect ', sid)

我曾考虑使用'pyramid.threadlocal.get_current_request',但此方法返回None。

我通过此代码将数据库设置添加到金字塔请求。

__ init __。py

def db(request):
    session = session_maker(request)
    return session

...
config.add_request_method(db, reify=True)

session_maker

def session_returner(request, connect_line):
    engine = create_engine(connect_line, echo=debug)
    Base.metadata.bind = engine
    Session = orm.sessionmaker(bind=engine)
    session = Session()

    def cleanup(request):
        if request.exception is not None:
            session.rollback()
        session.close()

    request.add_finished_callback(cleanup)

    return session


def session_maker(request, settings=None):
    if settings is None:
        settings = get_settings(request)

    connect_line = 'postgresql://{user}:{password}@{postgre_server}:{bd_port}/{bd_name}'.format(user=settings['bd_user'], postgre_server=settings['postgre_server'], bd_port=settings['bd_port'],  password=settings['bd_password'],  bd_name=settings['bd_name'])
    return session_returner(request, connect_line)
python-3.x pyramid python-socketio
1个回答
0
投票

您可以创建一个请求对象,但是显然,在不提供请求时,默认情况下没有一个对象。这可以通过以下方式完成:

request = pyramid.request.Request.blank('/')
request.registry = registry
pyramid.request.apply_request_extensions(request)

request.db.query(...)

这假定您有权访问由wsgi应用程序定义的注册表。来自另一个请求的config.registryapp = config.make_wsgi_app(); registry = app.registryrequest.registry之类的东西。

© www.soinside.com 2019 - 2024. All rights reserved.