yunvnadmin 发表于 2015-12-1 11:43:08

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']
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、怎么通过单击按钮,进入另一个响应函数?



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">&nbsp;&nbsp;&nbsp;密码</th>
</tr>
{% for key in items.keys() %}
  <tr>
  <td align="left"> {{key}}</td>
  <td align="right"> {{items}}</td>
  </tr>
{% end %}
</ul>
  其中<ul>表示无序列表(<ol>为有序列表) border="1"表示表格的边框, cellpadding="10"表示表格大小,“&nbsp;”表示空格,<td align="left">表示内容靠左(right则为靠右)。
  在.py文件中传入字典即可(其中的dic是自己定义的字典):



self.render("administrator.html",items=dic)
  3、
  
页: [1]
查看完整版本: tornado——python网页框架