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
相关产品推荐
相关产品推荐

