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即可 

(注意:参数个数不符合时,服务器会报错参数个数异常))

相关推荐