python项目(服务器报错及处理方法)
Python是面向对象语言,所以程序抛出的异常也是类
(一)常见的Python异常有:
NameError 尝试访问一个没有申明的变量
SyntaxError 语法错误
IndexError 索引超出序列范围
KeyError 请求一个不存在的字典关键字
AttributeError 尝试访问未知的对象属性
ValueError 传给函数的参数类型不正确,比如给int()函数传入字符串形
UnboundLocalError 未绑定本地错误
(二)以下是我最近遇到的问题及解决方案:
①python局部/本地变量引用赋值问题
做项目时刷新网页服务器提示报错:UnboundLocalError: local variable 'user_sub' referenced before assignment
所以尝试测试出解决方案
服务器提示(UnboundLocalError:赋值前引用本地变量'user_sub')
def cart(request): user_sub = 0 //修复时加上此句,给user_sub赋值即可解决 cartModel = CartModel.objects.all() total = 0 for commodity in CartModel.objects.all(): total += commodity.count total = int(total) user_sub = CartModel.sub_list(commodity, CartModel.objects.all()) commodity.save() return render(request, 'cart/cart.html', {'cartModel':cartModel, 'total':total, 'user_sub':user_sub})
刚开始我给user_sub加了一个global user_sub全局变量属性,随后服务器提示user_sub is not defind。
经正确改正后,我认为for循环中属于一个范围,有对user_sub进行赋值。但在外面看不到,相当于变量user_sub赋值前引用本地变量user_sub。
②服务器报错:AttributeError: 'int' object has no attribute 'save'(属性错误:'int'对象没有属性'保存)
根据服务器提示,我找到了报错行,该行功能计算商品价格
total += commodity.count total = int(total) count = commodity.count price = commodity.price commodity.money = count * price commodity.save()
修改后发现原来是行未对齐,将末尾两行缩进对齐即可.
**注意**:这里提醒了python先后级与行对齐有关,有许多小问题也都是由于行对齐引发
③ValueError: invalid literal for int() with base 10: '可口可乐'
(意为值错误:int()的无效字面值为10:'可口可乐')
传给函数的参数类型不正确,比如给int()函数传入字符串形,正是我犯的错误
product_id = request.POST['id'] //这是我POST请求发送的id //现在我检查输出下发现传过来的id是汉字,所以去改正POST发送数据即可 (这里要注意:id不能为汉字)
④引用JS文件问题
服务器报错:Uncaught ReferenceError: connect is not defined(未考虑参考错误:连接未定义)
这是引用文件问题,加上标头引入即可,模版页面键入
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script> //因为$是在jquery.js中定义
⑤HTML模版页面计算报错
item.count是商品数量,优惠条件是买三赠一
模型中价格计算式为
def act_price(self): self.tot_money = (self.count - int(self.count / 3)) * self.price self.save()
赠送数量可在HTML页面计算
刚开始我写成
<span class='gift_num'>{% widthratio item.count 3 %}</span>
运行后服务器报错:(TemplateSyntaxError("widthratio takes at least three arguments")
意思为TemplateSyntaxError(“widthratio至少需要三个参数”),所以加上参数1即可
正确写法为
<span class='gift_num'>{% widthratio item.count 3 1 %}</span> //widthratio宽度比
(三)补充:Django模版算法
<加法>:{{ value|add:10}}
value=5,则返回15
<减法>:{{value|add:-10}}
value=5,则返回-5,减法就是加一个负数
<乘法>:{% widthratio 5 1 100 %}
(注意:该算法会四舍五入,不适合小数点运算)
表示5/1 *100,返回500,widthratio需要三个参数,它会使用 参数1/参数2*参数3,所以要进行乘法的话,就将参数2设为1即可
<除法>:{% widthratio 5 100 1 %}
表示:5/100*1,返回0.05,只需要将第三个参数设置为1即可
(注意:参数个数不符合时,服务器会报错参数个数异常))