最近工作,可能需要用到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 包括模板,渲染,长连接,认证等常用的方面
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: <input type="password" name="userpwd"/>
<input type="submit" value="Log In"/><br/>
{{msg }}
<br/>因为没有连接数据库,所以账号为root,密码为123456
</form>
</body>
</html>
最后是结构
懒得写了。。。。以后在更新