Python报UnboundLocalError:局部变量server赋值前被引用如何解决
报错根因
你的判断方向完全正确,这个报错触发逻辑非常明确:
- 只有当响应头存在
Server字段时,循环逻辑才会给局部变量server赋值,一旦目标站点没返回这个头,后续print语句直接引用未赋值的server就会抛出UnboundLocalError - 同样的问题也存在于
via变量,只要响应头不带Via字段,打印VIA信息那行也会报一模一样的错 - 还有个隐藏触发场景:如果请求返回的状态码不是200,根本不会进入头遍历的逻辑块,两个变量都不会被赋值,同样会触发报错。
修复代码
不需要手动循环遍历响应头,requests的响应头本身是类字典结构,直接按键取值即可,记得提前给变量设置缺省值,覆盖所有可能的分支场景:
def get_headers(url: str) -> str: sessions = requests.Session() # 提前初始化变量,设置默认值,覆盖所有未匹配到对应头的场景 server = "N/A" via = "N/A" try: res = sessions.get(url, verify=False, headers=header, timeout=10) if res.status_code == 200: # 直接读取对应头字段,不存在则保留默认值 server = res.headers.get("Server", "N/A") via = res.headers.get("Via", "N/A") print(f"{Fore.MAGENTA}[+] {Fore.CYAN}-{Fore.WHITE} SERVER: {Fore.GREEN}{server}") print(f"{Fore.MAGENTA}[+] {Fore.CYAN}-{Fore.WHITE} VIA: {Fore.GREEN}{via}") except requests.exceptions.InvalidSchema: print("Please use https://www.target.com") except requests.exceptions.ConnectionError: print("Check the target URL and try again\n")
优化说明
- 删掉了冗余的头遍历循环,用字典自带的
get()方法取值,代码更简洁,执行效率更高 - 给请求加了
timeout参数,避免网络异常时程序无限挂起 - 所有分支路径下两个变量都有明确赋值,彻底解决变量未定义的报错
- 缺失的头字段统一显示
N/A,输出逻辑更统一,不会出现打印空值或者报错的情况
内容的提问来源于stack exchange,提问作者c0d3ninja
相关产品推荐
相关产品推荐

