用Python Tornado 框架搭建一个简单web服务器,能提供多个网页浏览
1.Tornad的基本框架,如下:
#导入需要用到的库
from tornado import web,ioloop,httpserver
#首页的视图函数
class MainPageHandler(web.RequestHandler):
def get(self,*args,**kwargs):
self.write('hi someboy')
#路由系统的设置
app = web.Application(
[
(r'/',MainPageHandler), #r作用取消转移字符。访问首页转移到MainPageHandler视图
]
)
#Tornado服务器的启动,主入口。固定写法,但参数app,8080可改
if __name__=='__main__':
#使用socket
http_sercer = httpserver.HTTPServer(app) #绑定路由app
http_sercer.listen(8080) #监听8080端口
ioloop.IOLoop.current().start() #
2.点击运行,然后在浏览器输入IP地址127.0.0.1:800,会显示出第六行代码:hi someboy
3.代码结构解析:
- 1.我们先看这部分路由分发,它的作用响应我们在浏览器输入的网址。这个函数现在的作用是:当我在浏览器输入网址127.0.0.1:8080的时候,tornado服务器就会去调用视图函数MainPageHandler里面的内容
#路由系统的设置
app = web.Application(
[
(r'/',MainPageHandler), #r作用取消转移字符。访问首页转移到MainPageHandler视图
]
)
- 2.在上一步步的路由分发来到了指定的MainPageHandler视图函数,如下函数:
#首页的视图函数
class MainPageHandler(web.RequestHandler):
def get(self,*args,**kwargs):
self.write('hi someboy')
- 该函数的主要关注是 self.write(‘hi someboy’) 这一部分,其它部分都是固定写法,这个函数的作用就是反馈给浏览器打印 hi someboy这段英文。
- 效果如下:
4.最简单的web服务就完成了。
5.我们引入一个含html的有点网页模样的视图模板,让我们的网页丰富点。
- 在原有的基础上我们加入多个路由分发任务:
1.加入登录视图函数:
#首页的登录视图函数:
class LoginPageHandler(web.RequestHandler):
def get(self,*args,**kwargs): #get请求
self.render('login.html')
2.加入另外Index视图函数:
#首页的视图函数2
class IndexHandler(web.RequestHandler):
def get(self,*args,**kwargs): #get请求
self.render('index.html')
3.我们加入了两个视图函数,因此我们的路由的分发也需要根据这两个视图函数设置对应请求地址:
#路由系统的设置
app = web.Application(
[
(r'/',LoginPageHandler), #r作用取消转移字符。访问首页转移到MainPageHandler视图
(r'/index',IndexHandler),
(r'/abc',abc.html),
],**settings #将settings中加载到路由中
)
4.当我们在浏览器输入127.0.0.1:8080/的地址后,路由指定了LoginPageHandler的视图函数反馈到浏览器;
而当我们输入了127.0.0.1:8080/index的地址后,路由指定了IndexHandler的视图函数反馈到浏览器;
5.将添加的代码整合在一起,如下:
from tornado import web,ioloop,httpserver
#首页的登录视图函数1
class MainPageHandler(web.RequestHandler):
def get(self,*args,**kwargs): #get请求
self.render('login.html')
#首页的视图函数2
class IndexHandler(web.RequestHandler):
def get(self,*args,**kwargs): #get请求
self.render('index.html')
#首页的视图函数3
class AbcHandler(web.RequestHandler):
def get(self,*args,**kwargs): #get请求
self.render('abc.html')
# 设置
settings = {
'template_path': 'templates', #设置模板文件路径(html)
'static_path': 'statics', #设置静态文件路径(css,js)
}
#路由系统的设置
app = web.Application(
[
(r'/',MainPageHandler), #r作用取消转移字符。访问首页转移到MainPageHandler视图
(r'/index',IndexHandler),
(r'/abc',AbcHandler),
],**settings #将settings中加载到路由中
)
#Tornado服务器的启动,主入口。固定写法,但参数app,8080可改
if __name__=='__main__':
#使用socket
http_sercer = httpserver.HTTPServer(app) #绑定路由app
http_sercer.listen(8080) #监听8080端口
ioloop.IOLoop.current().start() #
6.上述代码已经完成了我们想要的服务器工作的逻辑了,但是我们的视图函数却是没有的,如下面所添加的代码:
class LoginPageHandler(web.RequestHandler):
def get(self,*args,**kwargs): #get请求
self.render('login.html')
#首页的视图函数2
class IndexHandler(web.RequestHandler):
def get(self,*args,**kwargs): #get请求
self.render('index.html')
#首页的视图函数3
class LajiHandler(web.RequestHandler):
def get(self,*args,**kwargs): #get请求
self.render('laji2.html')
- 我们发现self.render(‘login.html’)、self.render(‘index.html’)、self.render(‘abc.html’),这三个函数中,我们并没有login.html、index.html、abc.html这三个html文件。所以我们需要创建这三个html文件。
- 在我们创建这三个html文件时候发现代码有这么的几行代码,它是设置我们html和css和js的文件位置的。其中css和js是辅助html文件的。所以我们要在列表创建新的文件夹:templates,再在该文件夹里面创建html文件;再创建一个新文件夹:statics,在该文件夹里面创建css、js文件。
# 设置
settings = {
'template_path': 'templates', #设置模板文件路径(html)
'static_path': 'statics', #设置静态文件路径(css,js)
}
7.html和css、js是可以根据个人喜欢设计的,下面展示我的html:
- 登录页面:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="/statics/css/style.css">
<link rel="stylesheet" href="/statics/css/iconfont.css">
<title>登录界面</title>
</head>
<body>
<div id="bigBox">
<h1>LOGIN</h1>
<div class="inputBox">
<div class="inputText">
<span class="iconfont icon-nickname"></span>
<input type="text" placeholder="Username" />
</div>
<div class="inputText">
<span class="iconfont icon-visible"></span>
<input type="password" placeholder="Password" />
</div>
</div>
<input class="loginButton" type="button" value="Login" />
</div>
</body>
</html>
- Index页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>胡乱网</title>
</head>
<body>
<h4>欢迎来到帅哥集中营!</h4>
</body>
</html>