You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 20:15:44