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

Django如何查看校验错误并修复视图UnboundLocalError异常

报错根因

你遇到的UnboundLocalError是以下两个场景变量未定义导致的:

  • 当request.user.is_staff为True时,代码不会进入if not request.user.is_staff分支,sites和categories两个变量从未被声明赋值
  • 当非管理员用户传入的筛选参数校验失败时,仅打印了错误日志,同样没有给两个变量赋值,渲染模板时直接引用就触发了报错

修复方案

你需要补充两个分支的业务逻辑处理,提前初始化变量或者给对应分支补全变量赋值逻辑,以下是修改后的完整代码,你可以根据实际业务需求调整分支逻辑:

views.py 修复后代码

import requests
from django.shortcuts import render
# 按需导入你需要的其他模块,比如要限制管理员访问可以导入 HttpResponseForbidden

def liveData(request):
    ip = request.session['ip']
    label = ""
    category = ""
    status = ""
    ordering = ""
    # 提前初始化变量和错误提示
    sites = None
    categories = None
    err_msg = ""
    
    # 获取GET参数用get方法更简洁,不需要额外捕获异常
    ordering = request.GET.get('order_by', '')
    category = request.GET.get('category', '')
    status = request.GET.get('status', '')

    site_url = ip + "/sites/list/"
    category_url = ip + "/setup/category/list/"
    headers = {
        'authorization': "Bearer *****",
    }

    if request.user.is_staff:
        # 管理员分支逻辑,这里示例为允许查看全量数据,如果你不需要管理员访问可以替换为返回403
        params = {
            'category': category,
            'status': status,
            'ordering': ordering
        }
        sites = requests.request("GET", site_url, headers=headers, params=params)
        categories = requests.request("GET", category_url, headers=headers)
    else:
        label = request.session['label']
        if Validations.validateAlphanumeric(category) and Validations.validateAlphanumeric(status):
            params = {
                'label': label,
                'category': category,
                'status': status,
                'ordering': ordering
            }
            sites = requests.request("GET", site_url, headers=headers, params=params)
            categories = requests.request("GET", category_url, headers=headers)
        else:
            print("invalid data..")
            err_msg = "筛选参数包含非法字符,仅支持输入字母和数字,请调整后重试"
            # 构造空响应对象,适配原有的json()调用
            class EmptyResp:
                def json(self):
                    return []
            sites = EmptyResp()
            categories = EmptyResp()
    
    return render(request, 'live-data.html', {
        'sites': sites.json(),
        'categories': categories.json(),
        'err_msg': err_msg
    })

配套调整(可选)

你可以在live-data.html中添加错误提示展示,让用户感知到参数异常:

{% if err_msg %}
<div style="color: red; margin: 10px 0;">{{ err_msg }}</div>
{% endif %}

如果不需要管理员访问该页面,可以把管理员分支的逻辑替换为:

from django.http import HttpResponseForbidden

# ... 省略其他代码 ...
if request.user.is_staff:
    return HttpResponseForbidden("您无权限访问该页面")

内容的提问来源于stack exchange,提问作者Namita Tare

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 20:24:06