Tornado之快速入门

最近工作,可能需要用到Tornado,先做一下技术准备,怕自己忘的快,写下来供参考,其实可以去看官网,嫌那个啰嗦。

此处省略前面的一些准备。


开始

以下是一个最基础的模板

import tornado.ioloop
import tornado.web

class Login(tornado.web.RequestHandler):   
    def get(self):
    	# 这里是打印
        self.write("This is Login")

application = tornado.web.Application([
    ("/login", Login)
])

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

以上就是 写了一个Login类 用来监听登陆界面的get请求。嗯。上面只有一个get方法
你可以自己在写一个put,delete之类的。就能支持REST服务设计,如果这里不是一眼能看懂,建议去看官网

下面是一些常用的关于模板的方法

1.获取来自请求的数据,比如账号,密码

unam = self.get_argument(“uname”)

如果你没有在请求的时候带入的这个参数就会给你一个错误
400: Bad Request

2.跳转到其他的页面

self.render(“index.html”,var = u"此处查询所有数据")

第一个参数是文件名字,这个必须的,后面的是自己特定的渲染,可以一个都不写,取用的方法有蛮多。最简单的是{{var}},这样比较简单。

3.写入数据

self.write(“This is Login”)

下面是关于SoketIO的方法

感觉用的比flask的好一点
大部分和模板的差不多。不过监听类里面的那个要稍加修改。 下面是个例子

class WebSocketHandler(tornado.websocket.WebSocketHandler):

1.监听某个服务,当你注册之后,有任何的客户端发起长连接请求,即会执行open方法,需要重写

def open(self, *args: str, **kwargs: str):

2.监听是否收到消息,收到消息之后,就会执行该方法,需要重写

def on_message(self, message):

3.发送消息,直接通过websoket对象发送,无需重写

self.write_message(message)

HTML端的写法,稍微有点不同,大部分都差不多

<script type="text/javascript">
    var ws;
    function onLoad(){
        ws = new WebSocket("ws://localhost:8888/ws");
        ws.onmessage = function(e){
            document.getElementById("message").innerText=e.data;
        }
    }
    function sendMsg(){
        ws.send(document.getElementById('msg').value);
    }
</script>
<body onload='onLoad();'>
    Message to send:   <input type="text" id="msg" />
      <input type="button" onclick="sendMsg();" value="发送" />
</body>

关于认证

这个不理解,就会特别麻烦。理解就觉得比较简单了
首先你得在Application 实例 的参数里面设置一个 cookie_secret 。感觉蛮抽象的。。。

1.存储cookie,前面一个是要取的名字,后面一个是特定时间内(可以不要这个参数),默认31天,以天为单位

self.set_secure_cookie(“username”,max_age_days=0.013)

2.读取cookie 基本同上

self.get_secure_cookie(“username”, username, expires_days=0.013)

自己的一个完整的案列

感觉写的蛮抽象的。。。

这个demo 包括模板,渲染,长连接,认证等常用的方面

service.py

import tornado.httpserver
import tornado.ioloop
import tornado.websocket
import tornado.web
import tornado.options
import os.path
import time

class BaseHandler(tornado.web.RequestHandler):
    def get_current_user(self):
        return self.get_secure_cookie("username",max_age_days=0.013)

class LoginHandler(BaseHandler):
    def post(self):
        username=self.get_argument("username")
        userpwd=self.get_argument("userpwd")

        # 这里去数据去查询,此处省略
        if username.__eq__("root")&userpwd.__eq__("123456"):
            self.set_secure_cookie("username", username, expires_days=0.013)
            self.redirect("/")
        else:
            self.render('login.html',msg="账号密码错误")

    def get(self):
        self.render('login.html',msg="")

class LogoutHandler(BaseHandler):
    def get(self):
        if (self.get_argument("logout", None)):
            self.clear_cookie("username")
            self.redirect("/")

class IndexHandler(BaseHandler):
    # 用户判断用户是否有登陆
    @tornado.web.authenticated
    def get(self):
        self.render('index.html',user=self.get_secure_cookie("username"))

    def post(self):
        print("这个没啥用")

class WebSocketHandler(tornado.websocket.WebSocketHandler):
    # def check_origin(self, origin):
    #     return True

    def open(self):
        for i in range(10):
            self.write_message("龙之吐息")
            time.sleep(3)

    def cloes(self):
        self.cloes()

if __name__ == "__main__":

    settings = {
        "template_path": os.path.join(os.path.dirname(__file__), "templates"),
        "cookie_secret": "bZJc2sWbQLKos6GkHn/VB9oXwQt8S0R0kRvJ5/xJ89E=",
        "xsrf_cookies": True,
        "login_url": "/login"
    }

    application = tornado.web.Application([
        (r'/', IndexHandler),
        (r'/login', LoginHandler),
        (r'/logout', LogoutHandler),
        (r'/ws', WebSocketHandler)
    ], **settings)

    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

index.html

<html>
<head>
    <meta charset="UTF-8">
    <title>Welcome Back!</title>
</head>
<body>
<h1> Hello, {{ user }}</h1>
<button name="re" onclick="receive()" value="">吐息</button>
<button name="col" onclick="wsClose()" value="">停止</button>
<script charset="UTF-8" type="text/javascript">
    var ws;
    function receive() {
        ws = new WebSocket("ws://localhost:8888/ws");

        ws.onmessage = function (e) {
            alert(e.data)
        }
    }
    // function sendMsg() {
    //     ws.send(document.getElementById('msg').value);
    // }
    function wsClose() {
       ws.close();
    }
</script>
</body>
</html>

login.html

<html>
<head>
    <title>Please Log In</title>
</head>

<body>
<form action="/login" method="POST">
    {% raw xsrf_form_html() %}
    Username:<input type="text" name="username"/><br/>
    Userpwd: &nbsp;<input type="password" name="userpwd"/>
    <input type="submit" value="Log In"/><br/>
    {{msg }}

    <br/>因为没有连接数据库,所以账号为root,密码为123456
</form>
</body>
</html>

最后是结构
在这里插入图片描述

懒得写了。。。。以后在更新

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值