1. 程式人生 > >Python Tornado簡介

Python Tornado簡介

import 有客 構造函數 建模 指定 span 網址 eth port

Tornado安裝

pip3 install tornado

初識Tornado

首先打開pycharm,新建一個幹凈的project

技術分享圖片

新建一個py文件:

技術分享圖片
import tornado.ioloop
import tornado.web


class MainHandler(tornado.web.RequestHandler):  # 類似於Django裏面的CBV
    def get(self):  # get方法
        self.write("Hello, world")


application = tornado.web.Application([  #
類似於Django裏面的路由系統 (r"/index", MainHandler), ]) if __name__ == "__main__": application.listen(8888) tornado.ioloop.IOLoop.instance().start() # 啟動
app.py

運行文件並打開瀏覽器訪問網址:

技術分享圖片技術分享圖片

運行該腳本,依次執行:

  • 創建一個Application對象,並把一個正則表達式‘/‘和類名MainHandler傳入構造函數:tornado.web.Application(...)  
  • 執行Application對象的listen(...)方法,即:application.listen(8888)
  • 執行IOLoop類的類的 start() 方法,即:tornado.ioloop.IOLoop.instance().start()

整個過程其實就是在創建一個socket服務端並監聽8888端口,當請求到來時,根據請求中的url和請求方式(post、get或put等)來指定相應的類中的方法來處理本次請求,在上述demo中只為url為http://127.0.0.1:8888/index的請求指定了處理類MainHandler(具體如何尋找見下文)。所以,在瀏覽器上訪問:http://127.0.0.1:8888/index,則服務器給瀏覽器就會返回 Hello,world ,否則返回 404: Not Found(tornado內部定義的值)

, 即完成一次http請求和響應。

由上述分析,我們將整個Web框架分為兩大部分:

  • 待請求階段,即:創建服務端socket並監聽端口
  • 處理請求階段,即:當有客戶端連接時,接受請求,並根據請求的不同做出相應的相應

經典的Login案例

首先,創建模版文件夾和模版文件:

技術分享圖片

login.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form method="POST" action="/login">
        <input type="text" name="username" />
        <input type="submit" value="提交" />
    </form>
</body>
</html>

新建一個路由:

    (r"/login", LoginHandler),

新建CBV:

class LoginHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("login.html")

    def post(self, *args, **kwargs):
        # 獲取url中以GET形式傳遞的數據
        self.get_query_argument()
        self.get_query_arguments()
        # 去請求體中獲取傳遞的數據
        self.get_body_argument()
        self.get_body_arguments()
        # 去get&post雙方去取數據
        user = self.get_argument(username)
        print(user)
        self.redirect(www.baidu.com)

註冊模版文件路徑:

# 申明settings,字典格式
settings = {
    template_path: tmp
}

# 註冊進tornado內部
application = tornado.web.Application([
    (r"/index", MainHandler),
    (r"/login", LoginHandler),
], **settings)

整體app文件:

技術分享圖片
#!/usr/bin/env python3
# encoding: utf-8
# Author: Dandy


import tornado.ioloop
import tornado.web


class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")


class LoginHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("login.html")

    def post(self, *args, **kwargs):
        # 獲取url中以GET形式傳遞的數據
        self.get_query_argument()
        self.get_query_arguments()
        # 去請求體中獲取傳遞的數據
        self.get_body_argument()
        self.get_body_arguments()
        # 去get&post雙方去取數據
        user = self.get_argument(username)
        print(user)
        self.redirect(www.baidu.com)


settings = {
    template_path: tmp
}


application = tornado.web.Application([
    (r"/index", MainHandler),
    (r"/login", LoginHandler),
], **settings)

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

此時便可執行

技術分享圖片技術分享圖片

技術分享圖片

關於靜態文件

首先添加靜態文件夾,並放入一張圖片

技術分享圖片

靜態路徑註冊:

settings = {
    template_path: tmp,
    static_path: statics
}

login頁面加入圖片、註意以下路徑寫的是static,標準用法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form method="POST" action="/login">
        <input type="text" name="username" />
        <input type="submit" value="提交" />
    </form>
    <img src="/static/炫雅.jpeg" />
</body>
</html>

此時訪問頁面

技術分享圖片

那能不能不用static作為靜態文件夾名稱呢?

答案當然是可以的,只需要這樣註冊:

settings = {
    template_path: tmp,
    static_path: statics,
    static_url_prefix: /jingtai/,  # 這裏就是用戶自定義的靜態路徑名稱
}

再去修改login網頁裏的就好了。

Python Tornado簡介