在金字塔中,如何检查NewRequest事件处理程序中的视图是否是静态的?

2024-03-28 22:47:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我在金字塔中有一个新的请求事件处理程序(订阅服务器),如下所示:

@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)

但是,我观察到,即使请求转到静态资产,到数据库的连接也会打开,这显然是不必要的。在NewRequest处理程序中,是否有一种方法可以检查请求是否绑定到静态资产?我尝试过将视图名称与静态视图名称进行比较,但显然,在处理请求的早期阶段,“视图名称”属性不可用。在

如果有人对此有什么有趣的想法,请告诉我!在


Tags: 服务器名称event视图处理程序newdbrequest
2条回答
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)

试试这个,我参考休耕网页 http://pyramid.readthedocs.org/en/1.3-branch/api/request.html “设置属性”部分,对我有用。在

暴力方法是将request.path变量与静态视图的根(larequest.path.startswith('/static/'))进行比较。在

我最喜欢并在我自己的应用程序中使用的方法是向request对象添加一个名为db的属性,该属性在访问时被延迟计算。因此,虽然您可以将其添加到请求中,但在访问它之前,它不会执行任何操作。在

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提供所需的内容。您可以通过cookbook entry子类Request子类并通过Pyramid的@reify装饰器添加自己的lazy属性,而无需使用订户。在

相关问题 更多 >