gpt4 book ai didi

python - 在 Pyramid 中,如何检查 View 在 NewRequest 事件处理程序中是否是静态的?

转载 作者:太空宇宙 更新时间:2023-11-03 15:25:24 24 4
gpt4 key购买 nike

我在 Pyramid 中有一个 NewRequest 事件处理程序(订阅者),它看起来像这样:

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

但是,我观察到即使请求转到静态 Assets ,也会打开与数据库的连接,这显然是不必要的。有没有办法从 NewRequest 处理程序检查请求是否绑定(bind)到静态 Assets ?我已尝试将 view_name 与我的静态 View 名称进行比较,但显然 view_name 属性在处理请求的早期阶段不可用。

如果有人对此有任何有趣的想法,请告诉我!

最佳答案

蛮力方法是将 request.path 变量与静态 View 的根进行比较,如 request.path.startswith('/static/')

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

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 装饰器添加您自己的惰性属性。

关于python - 在 Pyramid 中,如何检查 View 在 NewRequest 事件处理程序中是否是静态的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7865163/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com