开学过了一周,就被安排神马计算机技能培训。要的成果就是一个连接数据库的动态网站,仅此而已。什么也不讲,那老师只讲了一下,用asp或者php语言连接到数据库就行了。然后还说了句php是linux平台下的,我果断扔了句php是跨平台的。这水平还当老师~
还好指导书上写的语言不限,于是果断用python。开始的时候想过自己用cgi,但是觉得不够方便。又看了下django,好庞大的玩意。最后的最后,发现web.py完全满足这次的要求,连apache都可以不要,自带基本的web服务器。
web.py的文档有中文版,非常不错。虽然我也没有深入研究,但是我觉得有些细节还是得写一写。
web.config.debug = True
开发的时候肯定要把调试开启,跟踪报错很重要。我就是这样子发现该死的编码错误的,文件不要放在中文目录下,浏览器最好使用‘现代’浏览器,不然web.input处理中文会报错。
关于static目录,js,css,images神马文件之类的都放到这里面。我试过自己建文件夹,失败。在html里引用的时候,目录要使用static//file。解决办法就这样子,原理我也不想搞明白,也不想去搞明白,能用就行。好像是全局变量问题神马的。
templates模版目录,定义一个base是不错的选择。。。当然也可以用拼凑。在html里引用的时候是$:name,一定要注意那个冒号,不加冒号就被处理成纯文本了。
render = web.template.render('templates/',base='layout')
定义类就能生成页面,用urls的列表来关联类。类的return返回值就是生成的html,引用模版render.template(var)。。。当然返回值能有多个,要与模版的参数个数一致。
GET和POST,如其字面意思。如果想从网页中得到输入的参数就用POST。web.input()可以从网页中得到输入的数据,以字典的形式返回,所以对返回值用get方法就能得到想要数据。
class Login:
'''完全是用来骗老师伪登陆,只是作为一个例子说明'''
def POST(self):
i = web.input()
account = i.get('account','no account')
passwd = i.get('password','no password')
if account == 'maple' and passwd == '123':
return render.main(account,None,None)
else:
return render.error('account or password wrong')
web.py连接mysql和postgresql比较简单,wiki上有详细说明。我要提的就是关于sqlite,因为这种小玩意用mysql等完全就是杀鸡用牛刀,于是用python本身就自带的sqlite。但是web.py的连接数据库好像并不支持sqlite,所以请用python-sqlite语句对sqlite进行操作。在code.py开头最好不要定义web.py的数据库为sqlite,虽然这样子能连接上数据库,但是这毫意义还会对后面的数据为操作产生干扰。
我写的DKP管理系统的源码就不po出来了,虽然重写了一次,但是还是很丑。下周的目标就是用cgi重写一个,用现成的库虽然是挺不错,但是对于初学者来说并不是好事,对吧。
2014.12.29 update
今天我徒弟在使用webpy的时候遇见了一个问题,在使用下面这个用例的时候webpy在终端启动会报错error: No socket could be created
#!/usr/bin/env python
import web
urls = (
"/","index"
)
class index:
def GET(self):
return "hello world"
app = web.application(urls, globals())
app.run()
WTF!我看了半天也没有发现有问题。然后再和生产环境上对比发现,没问题呀,我生产环境上也是这么写的一点问题也没有。
但是生产环境下我关闭了调试模式,于是把重点关注到了调试模式上。当我把app.run使用 if name == “main”:封装起来后发现程序正常了。
原来webpy的调试模式会自己调用自己本身重载类达到动态调试的目的,那么上面这个程序就会有个问题。我父进程已经绑定了一个端口,当父进程重载文件的时候必定会运行它。所以app.run()会被运行开始绑定端口之类的操作,那必然导致端口冲突,因为父进程已经绑定了。