是否可以限制request_started
信号为特定请求运行?我浏览了网络,似乎只发现它对每个提出的请求都被触发。
您可以根据在environ
中找到的信息进行过滤。这与用于创建请求对象的信息相同。但是,信号本身在请求创建之前就已发送。
def callback(sender, environ, **kwargs):
if environ['PATH_INFO'] == '/your/url':
print('Your code here')
request_started.connect(callback)
不,您不能只为特定请求触发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'}