tornado——python网页框架
今天对tornado有了初步了解,早知道有这样的东西就不用一直用VC++开发界面了。
tornado用来开发网页,我将用它作为毕业设计的前台开发工具。
安装:
通过以下几步就可以轻松完成。或者自己下载一个,像下面一样解压安装就好啦。
wget http://github.com/downloads/facebook/tornado/tornado-2.1.1.tar.gz tar xvzf tornado-2.1.1.tar.gz cd tornado-2.1.1 python setup.py build sudo python setup.py install
其实可以自动安装的(推荐):
sudo apt-get install python-tornado
什么都不会呀,看这个网址确实适用于零基础学python表单和模板:
http://segmentfault.net/blog/qiwsir/1190000000733803
这个里面有教数据库操作,以后会用到:
http://demo.pythoner.com/itt2zh/ch1.html
一、按钮的使用
今天下午探索了一点按钮的用法,原来有提交按钮,普通按钮,重置按钮三种。
普通按钮:
<input type="button" value="ICMP DDOS" onclick="window.location='/ICMP_index';">
onclick用来响应action。/ICMP_index是和.py文件里的句柄相对应的。(不知道这样说对不对,其实我还不太懂运行原理)
明天继续补充……
二、上传文件
upload.py
import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.render('index.html') class UploadHandler(tornado.web.RequestHandler): def post(self): if self.request.files: myfile = self.request.files['myfile'][0] print self.request.files filename = myfile["filename"] fin = open("/home/lyc/download/%s"%filename,"w") #将上传的文件保存到这个路径 print "success to open file" fin.write(myfile["body"]) fin.close() self.render('show.html') application=tornado.web.Application([(r'/',MainHandler),(r'/upload', UploadHandler) ] ) if __name__=='__main__': application.listen(2033) tornado.ioloop.IOLoop.instance().start()
index.html
<html> <body> <form action="/upload" enctype="multipart/form-data" method="post"> <input name="myfile" type="file"> <input type="submit" value="Submit"> </form> </body></html>
show.html
<!DOCTYPE html> <html> <head> <title>success</title> </head> <body> <h2>Your file have been uploaded successfully</h2> </body> </html>
以上是最基本的本机——本机的文件传输,但我想实现的是上传到FTP服务器上。
打算直接在服务器(此服务器非ftp)上运行,可是发现在本机输入网址后,上传文件对话框里只有本机的文件。服务器是识别不了文件名的。
同时发现只能网页get到文件名和文件内容,但是路径无法获取,这样将文件先上传到服务器,再传到FTP的想法就失败了……额,我想静静
这个问题有待解决。
昨晚上睡不着的时候想到,传文件本来就是对文件的复制,只要知道文件名和内容,再创建一个就可以。今天发现,问题不在于读不到文件名,而是文件名的格式问题。
在web页面中获取的文件名是unicode格式。
<type 'unicode'> 2.txt
所以在open("filename","w")时识别不了filename。需要
filename.encode("utf-8")
将unicode编码为字节流,就可以创建文件了!
三、遇到的问题
1、怎么通过单击按钮,进入另一个响应函数?
[W 150407 15:48:33 web:989] 400 GET /administrator (127.0.0.1): Missing argument password
想在注册完成后,回到登录页面,刚开始直接在注册的函数里self.render("download.html"),这样可以进入登录页面,但是一登录就出现上面这个错误.经过观察发现了端倪:在登录页面时,地址竟然是http://localhost:8000/register(本来应该是http://localhost:8000),仔细一想,它可能还停留在注册函数中。
暂时没直接解决这个问题,就用了另一种方式实现。
单击按钮后,响应post方法,进行数据处理后,进入另一个页面(提示),将要进入的响应函数作为参数传入,点击按钮进入那个响应函数。
2、怎么将数据库中的内容显示到页面上。
刚开始想的是将数据以表格形式显示在页面上(最后应该还是免不了用这种方式),不过先循序渐进,用列表打印出来。
将下面这段代码放入html文件的<body>中:
<ul> {% for item in items %} <li>{{ escape(item) }}</li> {% end %} </ul>
在.py中,只需在render时传入参数items就可以调用了:
items = ["1","2"] self.render("list.html",items=items)
经过尝试,可以将字典中的内容显示到表格中:
在.html文件的<body>中设计表格(复制一下把原来的排版都弄乱了):
<ul> <table border="1" cellpadding="10"> <caption><h2>用户列表</h2></caption> <tr> <th align="left">用户名</th> <th align="right"> 密码</th> </tr> {% for key in items.keys() %} <tr> <td align="left"> {{key}}</td> <td align="right"> {{items[key]}}</td> </tr> {% end %} </ul>
其中<ul>表示无序列表(<ol>为有序列表) border="1"表示表格的边框, cellpadding="10"表示表格大小,“ ”表示空格,<td align="left">表示内容靠左(right则为靠右)。
在.py文件中传入字典即可(其中的dic是自己定义的字典):
self.render("administrator.html",items=dic)
3、