首页IT科技web开发入门与实战(十分钟学会web开发利器之tornado)

web开发入门与实战(十分钟学会web开发利器之tornado)

时间2025-06-20 02:11:15分类IT科技浏览5084
导读:一、从 hello, world 开始...

一                、从 hello, world 开始

如果你的 python 环境还没有安装 tornado                ,请直接使用 pip 安装:

pipinstalltornado

下面的代码                      ,虽然只有区区六行(不包括导入模块的两行)        ,却是一个完整的 web 服务程序                。运行下面的代码            ,就开启了一个 web 服务                      ,从本机浏览器直接访问 http://127.0.0.1            ,不出意外的话        ,我们的第一个网页 hello, world 即可正常显示出来                      。

demo.py

#-*-coding:utf-8-*- importtornado.ioloop importtornado.web classHomeHandler(tornado.web.RequestHandler): defget(self):#响应以get方式发送的请求 self.write("hello,world")#向请求者(浏览器)应答hello,world app=tornado.web.Application([(r"/",HomeHandler),])#URL映射 app.listen(80)#绑定侦听端口 tornado.ioloop.IOLoop.instance().start()#启动服务

如果多少了解一点 http 协议                      ,知道 get / post 方法                ,相信你一定能够读懂        。也许你的项目规划了很多的url    ,也许你的服务需要监听非80端口                      ,没有关系                   ,在这个代码上扩展就行            。仅仅六行!!!请让我们向犀利的                      、简洁的        、无所不能的 python 致敬!

划重点:tornado.web.RequestHandler.write() 不只可以接受字符串参数,还可以接受列表或字典参数——如果应答类型为json时                   ,这个重载特性非常高效                      。

二            、最简单的登录

假定我们有这样一个 web 服务需求:

(1)首页:地址“/                ”                      ,显示“点此登录                      ”两个汉字    ,点击则跳转到登录页面;

(2)登录页:地址“/login        ”                ,以 get 方式访问                      ,则显示账号                      、密码输入框和登录按钮;以 post 方式访问        ,则是提交表单提交            ,验证登录信息            。登录成功                      ,跳转至个人信息页面            ,否则        ,跳转至首页;

(3)个人信息页:地址“/me            ”                      ,显示登录账号        。

以上面的代码为基础                ,我们首先要做的工作是 URL 和 对应的处理类之间的关联                      。这件工作实际上是非常轻松愉快的:

app=tornado.web.Application([ (r"/",HomeHandler), (r"/login",LoginHandler), (r"/me",MeHandler) ])

接下来    ,我们要实现 HomeHandler            、LoginHandler 和 MeHandler 这三个类了                。通常                      ,我们习惯把这些和URL 对应的处理类                   ,保存为一个独立的文件,比如文件名为 handlers.py                   ,然后在服务器脚本 demo.py 中导入它们    。

handlers.py

#-*-coding:utf-8-*- importtornado.web classHomeHandler(tornado.web.RequestHandler): """响应主页请求""" defget(self):#以get方式请求 self.write("""<!DOCTYPEhtml><html><body><ahref="login">点此登录</a></body></html>""") classLoginHandler(tornado.web.RequestHandler): """响应登录页请求""" defget(self):#以get方式请求 self.write( """ <!DOCTYPEhtml><html><body><formmethod="POST"action="/login"> 账号:<inputtype="text"name="account"value=""/><br/> 密码:<inputtype="password"name="passwd"value=""/> <inputtype="submit"value="确定"/> </form></body></html> """ ) defpost(self):#以post方式请求(本例为提交表单) account=self.get_argument(account,None) passwd=self.get_argument(passwd,None) ifaccount==xufiveandpasswd==dgdgwstd: self.redirect(/me?name=%s%account) else: self.redirect(/) classMeHandler(tornado.web.RequestHandler): """响应个人信息页请求""" defget(self):#以get方式请求 name=self.get_argument(name,None) ifname: self.write( """ <!DOCTYPEhtml><html><head><metacharset="UTF-8"/></head> <body>欢迎你来到这里                      ,%s</body></html> """%name ) else: self.redirect(/)

相应地    ,服务脚本变成了这样:

demo.py

#-*-coding:utf-8-*- importos importtornado.ioloop importtornado.web fromtornado.optionsimportparse_command_line fromhandlersimport* parse_command_line() app=tornado.web.Application( handlers=[ (r"/",HomeHandler), (r"/login",LoginHandler), (r"/me",MeHandler) ], template_path=os.path.join(os.path.dirname(__file__),templates) ) app.listen(80)#绑定侦听端口 tornado.ioloop.IOLoop.instance().start()#启动服务

划重点:tornado.web.RequestHandler.get_argument() 可以读取通过表单和QueryString传递的参数                      。

三        、模板技术

读到这里                ,你一定会觉得奇怪:为什么服务端程序里面混杂了一大堆的 html 代码?Don’t worry                      ,以上的代码仅仅是帮助你建立基本概念的        ,实际上            ,tornado 是为数不多的支持模板技术很到位的框架之一                      ,其模板技术不仅支持继承            ,支持子模版                   。让我们一步一步讨论如何使用模板。

第1步:模板保存在哪儿?

在服务端脚本里        ,当我们使用 tornado.web.Application() 创建一个应用时                      ,通常需要传递一个 template_path 参数                ,这个参数就是模板文件的保存路径                   。上面的例子已经增加了这个参数    ,我们只要把模板文件放在和 demo.py 同级的 templates 文件夹下就可以了                      。

第2步:怎样写模板?

其实                      ,模板就是 html 文件                   ,只是其中混杂了少量特别约定的符号    。一个 web 项目,通常由若干页面组成                   ,这些页面有很多共同的地方                      ,因此一个基类模板是必要的                。

base.html

<!DOCTYPEhtml> <html> <head> <metacharset="utf-8"> <!--此处省略各种样式表文件--> </head> <body> {%blockblock_body%}{%end%} </body> <html>

基类模板 base.html 定义了一个 block_body 容器    ,如果有必要                ,我们在基类模板的任意位置定义更多的容器                      。假定我们需要一个个人信息页模板                      ,可以直接继承 base.html        ,然后只填写 block_body 这一部分就行了        。

me.html

{%extends"base.html"%} {%blockblock_body%} <h1>欢迎你来到这里            ,{{name}}</h1> {%end%}

个人信息页模板引中                      ,我们使用 {{}} 引用了一个变量 name            。

第3步:如何使用模板?

很简单            ,前面我们用 tornado.web.RequestHandler.write() 向浏览器应答信息        ,现在则是这样使用模板:

classMeHandler(tornado.web.RequestHandler): """响应个人信息页请求""" defget(self):#以get方式请求 name=self.get_argument(name,None) ifname: self.render(me.html,name=name) else: self.redirect(/)

常用的模板语法汇总                      ,如下:

(1)引用变量:{{…}}

(2)引用 python 表达式:{%…%}

(3)循环:{% for var in expr %}…{% end %}

(4)分支:{% if condition %}…{% elif condition %}…{% else %}…{% end %}

(5)引用原生表达式:{% raw expr %}

四                      、Cookie 演练

tornado.web.RequestHandler 的 cookie 操作非常灵活                ,下面的 handler 展示了 cookie 的基本读写方法:

classCookieHandler(tornado.web.RequestHandler): defget(self): visit_num=self.get_cookie(visit_num) ifnotvisit_num: visit_num=0 visit_num=str(int(visit_num)+1) #self.set_cookie(visit_num,visit_num,expires=None)#内存cookie self.set_cookie(visit_num,visit_num,expires=time.time()+1000)#持久化的cookie self.write("这是您第%s次访问本页面"%visit_num)

如果我们要使用持久化的 Cookie(硬盘 Cookie)    ,为了防止被破解                      ,一般是要加密的                   ,那么,在 tornado.web.Application 中需要设置 cookie_secret 项(加密因子)                      。

定义tornado.web.Application                   ,这是我最常用的一个模式:

classApplication(tornado.web.Application): def__init__(self): handlers=[ (r"/",WelcomeHandler),#欢迎信息 (r"/server_time",ServerTimeHandler)#显示服务器时间 ] settings=dict( title=u"网站名称", template_path=os.path.join(os.path.dirname(__file__),templates), static_path=os.path.join(os.path.dirname(__file__),static), cookie_secret=rewqr4gfd654fdsg@$%34dfs, session_expiry=0, login_url="/", debug=1 ) tornado.web.Application.__init__(self,handlers,**settings)

五                、Session 扩展

为 tornado 增加 session 机制                      ,基本思路就是从 tornado.web.RequestHandler 派生新类    ,重写 initialize() 方法            。当类实例被构造函数创建后                ,会先运行该方法        。我们定义 initialize() 方法读取名为 session_id 的 cookie                      ,如果存在        ,则读取以 session_id 命名的 session 文件            ,取得 session 内容                      ,否则            ,session 为空                      。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
主机不支持mmu虚拟化(虚拟主机不支持中文怎么解决) powerengine框架(PowerBuilder编程新思维6:装饰(用最简单的方式做框架))