如何在 socketio 方法中获取全局金字塔请求?
How can I get global pyramid request in socketio methods?
我想使用 python-socketio,我想通过 socketio 方法查询我的数据库。我的数据库设置保存在金字塔请求中。但是我不明白如何在没有 http-requests 的情况下获得这些设置。
@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”,但这个方法returnsNone。
我通过这段代码将数据库设置添加到金字塔请求中。
__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)
您可以创建一个请求对象,但显然在不为请求提供服务时默认情况下没有一个。这可以通过以下方式完成:
request = pyramid.request.Request.blank('/')
request.registry = registry
pyramid.request.apply_request_extensions(request)
request.db.query(...)
这假设您可以访问由 wsgi 应用程序定义的注册表。来自另一个请求的 config.registry
或 app = config.make_wsgi_app(); registry = app.registry
或 request.registry
。
我想使用 python-socketio,我想通过 socketio 方法查询我的数据库。我的数据库设置保存在金字塔请求中。但是我不明白如何在没有 http-requests 的情况下获得这些设置。
@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”,但这个方法returnsNone。
我通过这段代码将数据库设置添加到金字塔请求中。
__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)
您可以创建一个请求对象,但显然在不为请求提供服务时默认情况下没有一个。这可以通过以下方式完成:
request = pyramid.request.Request.blank('/')
request.registry = registry
pyramid.request.apply_request_extensions(request)
request.db.query(...)
这假设您可以访问由 wsgi 应用程序定义的注册表。来自另一个请求的 config.registry
或 app = config.make_wsgi_app(); registry = app.registry
或 request.registry
。