python学习:python网络框架Tornado(1):安装和使用

Python的Web框架Tornado

Tornado安装

Tornado安装命令:pip3 install tornado

 

安装过程出现错误,升级pip

 

根据提示执行命令:python –m pip install –upgrade pip

我们这里因为同时安装python2.7和python3.7,所以将python.exe修改成了python2和python3。所以需要将python替换成对应名字执行。

 

再次执行安装tornado命令。

 

 

Tornado的’hello world’

    在GitHub上可以找到Tornado源码。

网址:https://github.com/tornadoweb/tornado

可以拷贝其中hello world示例:

import tornado.ioloop

import tornado.web

#相当于CBV中视图类

class MainHandler(tornado.web.RequestHandler):

    #get方法,处理get请求

    def get(self):

        #返回信息,相当于HttpResponse

        self.write("Hello, world")

#url系统

def make_app():

    return tornado.web.Application([

        (r"/", MainHandler),

    ])

if __name__ == "__main__":

    #app对象

    app = make_app()

    #监听链接端口

    app.listen(8888)

    tornado.ioloop.IOLoop.current().start()

运行hello.py,直接浏览器访问localhost:8888/就可以看到hello world页面。

 

Tornado配置静态路径,模板路径

配置静态文件路径,配置模板路径等,这里创建了静态文件夹static和模板文件夹templates。

import tornado.ioloop
import tornado.web
#相当于CBV中视图类
class MainHandler(tornado.web.RequestHandler):
    #get方法,处理get请求
    def get(self):
        #返回信息,相当于HttpResponse
        self.write("Hello, world")
#使用render("模板页面")
class LoginHandler(tornado.web.RequestHandler):
    #get方法,处理get请求
    def get(self):
        #默认查找当前目录,其他目录需要配置文件
        self.render("login.html")
    #post方法,接收post数据
    def post(self):
        #获取数据
        user = self.get_argument("user")
        pwd = self.get_argument("pwd")
        print(user,pwd)

#配置文件,将配置文件在url中引用
settings = {
    #配置模板路径
    "template_path":"templates",
    #配置静态文件路径
    "static_path":"statics",
    #配置静态路径别名
    "static_url_prefix":"/static/"
}
#url系统
#tornado.web.Application(路由列表,配置文件)
def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
        (r"/login",LoginHandler),
    ],**settings)

if __name__ == "__main__":
    #app对象
    app = make_app()
    #监听链接端口
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

其中login.html代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登陆页面</title>
</head>
<body>
    <form action="/login" method="post">
        <p><input type="text" name="user"></p>
        <p><input type="password" name="pwd"></p>
        <p><input type="submit" value="提交"></p>
    </form>
    <!--静态文件-->
    <img src="/static/back3.jpg">
</body>
</html>

 

Tornado页面跳转

    使用self.render(“模板页面”,参数字典)方法,返回一个页面;

    使用self.redirect(“页面url”)方法,复位向到新的url页面;

示例:

self.render("login.html")

self.render("login.html",msg="hello")

key_dict = {"name":"","age":""}

self.render("login.html",**key_dict)

self.redirect("www.baidu.com")

self.redirect("/login")

Tornado的Cookie

    使用self.set_cookie(“键”,”值”),设置cookie;

    使用self.get_cookie(“键”),获取cookie;

示例:

#设置cookie
self.set_cookie("is_login","true")

class HomeHandler(tornado.web.RequestHandler):

    #get方法,处理get请求

    def get(self):

        #获取cookie判断

        if self.get_cookie("is_login") == "true":

        #返回信息,相当于HttpResponse

            self.write("欢迎登陆")

        else:

            self.redirect("/login")

设置加密的cookie,使用set_secure_cookie(“键”,”值”)

获取加密的cookie,使用get_secure_cookie(“键”)

使用加密cookie,需要配置文件配置:"cookie_secret":"xxxx",

示例:

#配置文件,将配置文件在url中引用

settings = {

    #配置模板路径

    "template_path":"templates",

    #配置静态文件路径

    "static_path":"statics",

    #配置静态路径别名

    "static_url_prefix":"/static/",

    #配置cookie加密

    "cookie_secret":"abscksjfi",

}

示例:

#设置加密cookie

self.set_secure_cookie("is_login","true")

#获取加密cookie

self.get_secure_cookie("is_login")

Tornado的Handler

     Tornado的视图函数,定义为handler,处理页面请求。
定义处理类,继承tonado.web.RequestHandler
class XXX(tornado.web.RequestHandler):
      #get请求处理方法
      def get(self):
               #处理逻辑
      #post请求处理方法
      def post(self):
               #处理逻辑
示例:
class LoginHandler(tornado.web.RequestHandler):

    #get方法,处理get请求

    def get(self):

        #默认查找当前目录,其他目录需要配置文件

        self.render("login.html",msg="hello")

        key_dict = {"name":"","age":""}

        self.render("login.html",**key_dict)

    #post方法,接收post数据

    def post(self):

        #获取数据

        user = self.get_argument("user")

        pwd = self.get_argument("pwd")

        print(user,pwd)

        self.redirect("www.baidu.com")

        self.redirect("/login")

 

Tornado获取请求信息

     使用self.request.files[“键”],获取页面提交文件内容;
     使用self._headers,获取请求头;
     使用self.get_cookies,获取cookie;
     使用self.get_arguments(),获取所有请求参数;
     使用self.get_argument(),获取请求参数;
     使用self.method,请求方式;
     使用self.url,请求的url;
     使用self.body,请求体;
     使用self.version,请求version;
     self.request对象,其实是tornado.httputil import HTTPServerRequest的实例化对象。
 

Tornado的模板

    Tornado的模板和Django的模板语言类似,Tornado的for循环不同。

语法:

    {% for i in range(10)%}

        {{i}}

    {% end %}

直接就是end结束。

 

UIMETHOD,自定制方法。

示例:

创建一个uimethod文件夹,创建UIMethod.py文件,

UIMethod.py内容:

#自定义tab方法

def tab(self):

    return "UImethod"

在setting中配置ui_methods

示例:

导包:

from uimethod import UIMethod

在setting中配置:

#配置ui_methods

"ui_methods":UIMethod,

 

在html模板中使用:

示例:

    {{tab()}}
可以直接使用()传参数。
 

UIMODULE,自定义模块。

    UIMODULE可以添加js、css和文档内容等

示例:

创建uimodule文件夹,创建UIModule.py文件。

UIModule.py内容:

from tornado.web import UIModule

 

#定义一个类,继承UIModule

class Mymodule(UIModule):

    #重新render方法

    def render(self, *args, **kwargs):

        return "UImodule"

 

setting中注册我们编写的module:

导包:

from uimodule import UIModule

 

Setting配置:

#配置ui_modules

"ui_modules":UIModule,

 

UIMethod和UIModule比较:

UIMethod,UIModule返回一个字符串,例如:返回一个<a>标签的字符串,UIMethod会自动转义,UIModule不会自动转义;

    UIMethod会自动将字符串转义,如果我们再使用escape转换就会直接输出标签字符串,我们可以通过配置setting,将自动转义关闭。

    UIModule不会自动将字符串转义,返回原样输出。

    转义过程有两个:UIMethod在tornado内部自动转义,然后浏览器再次转义后,输出是字符串;

    UIModule在tornado内部不会自动转义,然后浏览器在转义时,就根据字符串转换成html标签元素;

示例:

setting中关闭自动转义

#将自动转义关闭

"autoescape":None,

 

示例:

from tornado import escape

#自定义tab方法

def tab(self):

    #返回字符串,method在tornado会自动转义

    #使用 {{ tab() }} ,本来转义了,浏览器再次转义,显示<a href='http://www.baidu.com'>百度一下</a>字符串,

    #使用  {% raw tab() %},正常显示a链接,raw表示原样显示,浏览器不需要转义,只转义一次

    return "<a href='http://www.baidu.com'>百度一下</a>"

    #使用escape.xhtml.escape(),模拟method在tornado中自动转义,再转义一次

    # return escape.xhtml_escape("<a href='http://www.baidu.com'>百度一下</a>")

 

html页面调用method

<!--uimethod调用-->

 {{ tab() }}

 {% raw tab() %}

<!--uimodule调用-->

{% module Mymodule() %}

UIModule可以插入css,js代码或css,js的文件:
示例:
from tornado.web import UIModule


#定义一个类,继承UIModule

class Mymodule(UIModule):

    #插入css代码

    def embedded_css(self):

        return "h2{display:none}"

    #插入css文件,查找statics静态文件夹中test.css

    def css_files(self):

        return "test.css"

    #插入js文件,会自动去statics配置的静态文件夹中查找test.js

    def javascript_files(self):

        return "test.js";

    #插入js代码

    def embedded_javascript(self):

        return "function hello(){alert('hello')}"

 

    #重新render方法

    def render(self, *args, **kwargs):

        return "<h2>UImodule<h2>"

 

posted @ 2020-12-22 18:45  渔歌晚唱  阅读(356)  评论(0)    收藏  举报