利用web.py+html(bootstrap)+mysql实现了一个小型的设备管理系统,在这个过程中遇到很多问题,将问题及解决方案总结如下,有遇到类似问题的同学,希望可以帮到你们。
1、关于中文的编码方式,mysql+python+web.py+html的这个东西,从html页面输入中文提交insert到数据库,再从数据库中读取
内容到展示在html页面上,中文的乱码问题的处理,具体见虾米的博客中,写了这个处理方式,主要就是:
(1)各个部分的编码方式都保持唯一
(2)在mysqldb中的cursor.py的文件中的encode中的charset直接改成了'utf-8',这样就能将中文正确插入到数据库了
(3)然后在对数据库进行get操作的所有py文件的类方法中,conn时最后面增加一个charset="utf8"的参数,这样就能从数据库中
取出中文并显示正确了
2、今天遇到了在html通过python语句for打印出来所有语句的时候,使用range(1,len(xxx))的时候,提示'int' object is not callable,但是换成了xrange就可以了,
刚开始一直认为是range和xrange之间有什么区别,导致出现这个问题,后来一点一点排除,发现是range的问题,再往上查看代码,发现先定义了一个range的变量(是int型的),所以后面再用python的内置方法range()时出现提示"'int' object is not callable"的提示;
range和xrange的区别:(在python 2.X下)
range的返回结果是一个list、xrange的返回结果是一个迭代器,两者都可以用于for循环,但是range因为会生成一整个list,所以占用空间要比xrange大,速度上也会比xrange要慢。
一般情况下循环都用range,但是如果是极大长度的数组就需要用xrange,生成器的意思是不预先分配数组长度的空间 是循环到哪 分配到哪
另外,针对这种遍历的操作,如果需要取元素内容的,直接用for one in ll
如果同时需要迭代变量和元素内容的,直接用for i, item in enumerate(ll),其中ll可以是list、dict、tuple
3、url的控制相关的需要总结(尤其是xx\(d+)这样子的跳转控制)
url跳转格式:
urls = (
'/', 'index',
'/login', 'login')
urls是一个全局变量,在web.py中能够被识别为所有url跳转的存储信息站,以元组的形式存储,前面是传进来的url的正则表达式,后面是处理类,如第一行的"/",就是说:http://localhost:8080/在浏览器中点击enter之后,程序就会收到这个请求是"/",然后后面的处理类是index,就会去找class index,在index中根据情况,确定下一步的跳转逻辑,需要请求数据返回结果的,通过def GET(self)方法来实现,如果要提交结果并根据提交处理的结果返回一定的内容,就要走POST请求,通过def POST(self)方法来实现
还有一种跳转格式是这样的:'/updateinfo/(\d+)', 'updateInfo',
那么这种主要是用于什么情况呢?在updateInfo类中又如何体现这个"(\d+)"呢?
答:主要用于如下情况,比如你的程序有一个表格显示了多行数据,每一行数据对应一个特定的ID,当然你可以拿到这个ID,然后你可以通过点击一个修改链接,如"修改"的链接来跳转到另一个页面,但是在跳转到的另一个页面上,需要先显示出来之前的表格内容,这种情况就需要这样处理了,当然如果在一个内部系统内,没有什么安全问题的话,直接写ID就可以,要是有安全问题的话,可能就需要做一个md5加密之类的了。
接下来说这个'/updateinfo/(\d+)',第二个"/"的"(\d+)",其实就是一个正则表达式,这样的话,根据你需要传递的信息内容,定义正则表达式的格式。
在具体的updateInfo类中的def GET(self)和def POST(self)方法,又是如何用到这个"(\d+)"的呢?
答:方法需要修改成def GET(self, info_id)和def POST(self, info_id)了,然后在程序中直接写info_id = int(info_id)就可以得到你想要的值了,接下来就可以用这个值操作数据库的值了,比如获取当前ID对应的数据信息,比如修改当前ID对应的数据信息
4、page分页相关的需要总结
其实分页主要分为以下几个部分的处理:
(1)sql要针对一页显示的数目设置sql语句,会包含offset设置偏移量用来得到正确的每页应该显示的数据
(2)html页面上对于分页的显示相关(包括当前页数显示,总页数显示,并且能够点击某页的链接刷新出对应的数据)
处理方式如下:
(1)对于sql的处理——
在主业务逻辑中需要从web.input()中得到当前需要显示的page数,在def GET(self)具体代码如下:
i = web.input(page='1')
page= int(i.page)
注意,这里web.input(page='1')在括号中的page='1'相当于设置一个默认值,如果当前没有传入page值的话,就代表是请求第一页的数据,如果传入的是非第一页的值,则得到正确的page参数值,之后再用这个page变量作为参数,传给model.py中的进行数据库操作的类的某个方法
在具体的数据库操作的类的方法中,得到page参数,然后具体代码如下:
per_page =settings.per_page#获取本次需要检索的offset偏移量的值
offset = (page - 1) *per_page
if userid != '':
sql= "select * from androiddevice where storeman='%d' order by androiddevice.id desc limit %d offset %d" %(userid, per_page, offset)else:
sql= "select * from androiddevice order by androiddevice.id desc limit %d offset %d" %(per_page, offset)print 'sql', sql
其中per_page是从settings.py文件中获取到的每页显示x个的数据值,然后根据这个值得到offset偏移量的值,注意limit后面是%d,offset后面也是%d,不用再加''了,否则就会不被当做一个int型的值
(2)html页面的处理——
$code:
grace= 5range1= grace * 2start= page - grace if page - grace > 0 else 1end= start +range1if end >page_count:
end=page_count
start= end - range1 if end - range1 > 0 else 1
在$def with()的下方定义$code,然后得到start和end变量,之后在html的页面适当位置显示
$if start > 1:1...
$for i in xrange(start, end+1):
$if i == page:$i$else:$i$if end<... class="page" href="/list2personiosdevice?page=%24page_count">$page_count