教你快速学会web开发之tornado

如何快速学会web开发之tornado?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

成都创新互联是专业的资溪网站建设公司,资溪接单;提供成都网站设计、成都网站制作,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行资溪网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

一、从 hello, world 开始

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

pip install tornado

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

demo.py

# -*- coding: utf-8 -*-
import tornado.ioloop 
import tornado.web
class HomeHandler(tornado.web.RequestHandler): 
    def get(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 -*-
import tornado.web
class HomeHandler(tornado.web.RequestHandler): 
    """响应主页请求"""
    
    def get(self): # 以get方式请求
        self.write("""<!DOCTYPE html><html><body><a href="login">点此登录</a></body></html>""")
class LoginHandler(tornado.web.RequestHandler): 
    """响应登录页请求"""
    
    def get(self): # 以get方式请求
        self.write(
            """
            <!DOCTYPE html><html><body><form method="POST" action="/login">
                账号:<input type="text" name="account" value="" /><br />
                密码:<input type="password" name="passwd" value="" />
                <input type="submit" value="确定" />
            </form></body></html>
            """
        )
    
    def post(self): # 以post方式请求(本例为提交表单)
        account = self.get_argument('account', None)
        passwd = self.get_argument('passwd', None)
        
        if account == 'xufive' and passwd == 'dgdgwstd':
            self.redirect('/me?name=%s'%account)
        else:
            self.redirect('/')
class MeHandler(tornado.web.RequestHandler): 
    """响应个人信息页请求"""
    
    def get(self): # 以get方式请求
        name = self.get_argument('name', None)
        if name:
            self.write(
                """
                <!DOCTYPE html><html><head><meta charset="UTF-8" /></head>
                <body>欢迎你来到这里,%s</body></html>
                """%name
            )
        else:
            self.redirect('/')

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

demo.py

# -*- coding: utf-8 -*-
import os
import tornado.ioloop 
import tornado.web
from tornado.options import parse_command_line
from handlers import *
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

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <!-- 此处省略各种样式表文件 -->
  </head>
  <body>
  {% block block_body %}{% end %}
  </body>
<html>

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

me.html

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

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

第3步:如何使用模板?

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

class MeHandler(tornado.web.RequestHandler): 
    """响应个人信息页请求"""
    
    def get(self): # 以get方式请求
        name = self.get_argument('name', None)
        if name:
            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 的基本读写方法:

class CookieHandler(tornado.web.RequestHandler):
    def get(self):
        visit_num = self.get_cookie('visit_num')
        if not visit_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,这是我最常用的一个模式:

class Application(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 为空。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联行业资讯频道,感谢您对创新互联的支持。

本文题目:教你快速学会web开发之tornado
链接分享:https://www.cdcxhl.com/article2/ggecic.html

成都网站建设公司_创新互联,为您提供营销型网站建设品牌网站设计建站公司网站设计商城网站外贸网站建设

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

外贸网站制作