Skip to main content
 首页 » 编程设计

python之为什么要从 WSGI 环境中复制字典

2025年05月04日9mfrbuaa

在下面example from wsgi.org被 cur_named 复制:

def __call__(self, environ, start_response): 
    script_name = environ.get('SCRIPT_NAME', '') 
    path_info = environ.get('PATH_INFO', '') 
    for regex, application in self.patterns: 
        match = regex.match(path_info) 
        if not match: 
            continue 
        extra_path_info = path_info[match.end():] 
        if extra_path_info and not extra_path_info.startswith('/'): 
            # Not a very good match 
            continue 
        pos_args = match.groups() 
        named_args = match.groupdict() 
        cur_pos, cur_named = environ.get('wsgiorg.routing_args', ((), {})) 
        new_pos = list(cur_pos) + list(pos_args) 
        new_named = cur_named.copy() # Why copy()? 
        new_named.update(named_args) 
        environ['wsgiorg.routing_args'] = (new_pos, new_named) 
        environ['SCRIPT_NAME'] = script_name + path_info[:match.end()] 
        environ['PATH_INFO'] = extra_path_info 
        return application(environ, start_response) 
    return self.not_found(environ, start_response) 

为什么不直接调用 ur_named.update(named_args)?

请您参考如下方法:

你知道cur_named 字典是从哪里来的吗?只是想像下面这样的东西:

SOME_CONFIG = { 
    'some_key': ((..., ...), {...}), 
    ... 
} 
 
environ['wsgiorg.routing_args'] = SOME_CONFIG['some_key'] 

现在,当您就地更新 new_named 时,您实际上是在更新 SOME_CONFIG 中的内部字典,这会将您的数据带到其他请求中。安全的方法是复制字典,除非您确定不需要它。