为特定请求使用request_started信号

问题描述 投票:0回答:2

是否可以限制request_started信号为特定请求运行?我浏览了网络,似乎只发现它对每个提出的请求都被触发。

python django django-signals
2个回答
1
投票

您可以根据在environ中找到的信息进行过滤。这与用于创建请求对象的信息相同。但是,信号本身在请求创建之前就已发送。

def callback(sender, environ, **kwargs):
    if environ['PATH_INFO'] == '/your/url':
        print('Your code here')


request_started.connect(callback)

0
投票

不,您不能只为特定请求触发request_started,但是您可以“提前退出”其他信号处理程序。

您可以使用PATH_INFO变量并执行“标准Django请求处理工作”以进行路由解析,并获取有关应用程序的更多信息,在请求中执行的视图等。

有一个有效的示例(当然是针对我的测试项目的环境和网址)。

from django.core.signals import request_started
from django.urls import resolve, Resolver404


def callback(sender, environ, **kwargs):
    if not 'PATH_INFO' in environ:
        return

    path = environ['PATH_INFO']
    try:
        match = resolve(path)
    except Resolver404:
        return

    if match.url_name == 'stores_storecategory_history':
        from pprint import pprint
        pprint(match.__dict__)


request_started.connect(callback)

仅在url路由模式上执行,我可以在处理程序中做任何我想做的事。

web_1            | {'_func_path': 'reversion.admin.history_view',
web_1            |  'app_name': 'admin',
web_1            |  'app_names': ['admin'],
web_1            |  'args': (),
web_1            |  'func': <function VersionAdmin.history_view at 0x7f522292b9d0>,
web_1            |  'kwargs': {'object_id': '1586'},
web_1            |  'namespace': 'admin',
web_1            |  'namespaces': ['admin'],
web_1            |  'route': 'admin/stores/storecategory/<path:object_id>/history/',
web_1            |  'url_name': 'stores_storecategory_history',
web_1            |  'view_name': 'admin:stores_storecategory_history'}
© www.soinside.com 2019 - 2024. All rights reserved.