web.py mysql json_web.py+html+mysql实现web端小系统的问题汇总

利用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值