Tornado框架的簡單使用


一、Tornado Web應用程序的結構

import tornado.web
 
class LoginHandler(tornado.web.RequestHandler):
 
    def get(self):
        self.write('www')
 
    def post(self):
        pass
 
#生成路由規則
application= tornado.web.Application([
    (r"/login/",LoginHandler),
])
 
if __name__ == '__main__':
    application.listen(8888)  #創建socket對象並將其添加到select或者epoll中
    tornado.ioloop.IOLoop.instance().start() #將select或者epoll進行死循環 

Tornado Web應用程序通常由一個或多 個RequestHandler子類,一個Application將傳入請求路由到處理程序對象以及一個main()啟動服務器功能組成。

RequestHandler:Tornado Web應用程序的大部分工作是在的子類中完成的RequestHandler主入口點的處理程序的子類是所處理的HTTP方法命名的方法:get()、post()等。每個處理程序可以定義這些方法的一個或多個來處理不同的HTTP操作。在處理程序中,調用諸如RequestHandler.render或的 方法RequestHandler.write以產生響應。

Application:負責全局配置,包括將請求映射到處理程序的路由表。

二、路由系統

tornado的路由系統是一個url對應一個類,這與django的CBV模式類似。

...

#生成路由規則
application= tornado.web.Application([
    (r"/login/",LoginHandler),
  (r"/order/([0-9]+)", OrderHandler, dict(db=db), name="order")
]) ...

  路由表是URLSpec對象(或元組)的列表,每個對象(至少包含)一個正則表達式和一個處理程序類。使用第一個匹配規則。如果正則表達式包含捕獲組,則這些組是路徑參數,並將傳遞給處理程序的HTTP方法。如果將字典作為的第三個元素傳遞URLSpec,則它會提供將傳遞給 初始化參數RequestHandler.initialize。

三、視圖函數

  • 獲取請求相關信息
         self.get_cookie() #獲取cookie
         v = self.get_argument('p') #可以用於獲取用戶的get請求和post請求發來的數據
         print(v)
         self.request #封裝了用戶發來的所有請求(如果找不到相關請求就去request中找)
        # print(type(self.request))
        # from tornado.httputil import HTTPServerRequest
  • 視圖
import tornado.web
 
class LoginHandler(tornado.web.RequestHandler):
 
    def get(self):
        print(self.get_argument('p'))     
     self.set_cookie(‘k1’,'v1') #可以進行cookie的設置    
self.set_header('k2','v2') #可以設置header
#self.write('www') #往頁面上寫數據
     #self.redirect('/index/')#重定向
self.render('login.html') def post(self): print(self.get_argument('user')) settings={ "static_path":"static", #這是放置靜態文件的目錄名稱 "static_url_prefix":"/sta/", #這是訪問靜態文件引用的url前綴 "template_path":"templates" } #生成路由規則 application= tornado.web.Application([ (r"/login/",LoginHandler), ],**settings) #將settings傳入 if __name__ == '__main__': application.listen(8888) tornado.ioloop.IOLoop.instance().start()
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/sta/commons.css" />
</head>
<body>
<h1>登陸</h1>
<form method="post">
    <input type="text" name="user">
<input type="submit" value="提交">
</form>
</body>
</html>
login.html

四、模板引擎

1、模板及靜態文件的配置

  默認情況下,Tornado在與.py引用模板文件的目錄相同的目錄中查找模板文件要將模板文件放在不同的目錄中,需要在settings中進行配置(使用template_path參數,以及靜態文件目錄也是在settings中進行配置。

這可以在Tornado的源碼中查看:

所以,可以在settings中進行設置,並且傳入Application中:

settings={
    "static_path":"static", #這是放置靜態文件的目錄名稱
    "static_url_prefix":"/sta/",  #這是訪問靜態文件引用的url前綴
    "template_path":"templates" #這是模板文件的目錄名稱
}
 
#生成路由規則
application= tornado.web.Application([
    (r"/login/",LoginHandler),
],**settings)  #將settings傳入
 

在根目錄下建立templates目錄,內部生成html文件:

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/sta/commons.css" />  <!--引入靜態文件-->
</head>
<body>
<h1>登陸</h1>
 
</body>
</html>
login.html

2、模板渲染

  Tornado 的模板支持“控制語句”和“表達語句”,控制語句是使用 {% 和 %} 包起來的 例如 {% if len(items) > 2 %}。表達語句是使用 {{ 和 }} 包起來的,例如 {{ items[0] }}

  控制語句和對應的 Python 語句的格式基本完全相同。我們支持 ifforwhile 和 try,這些語句邏輯結束的位置需要用 {% end %} 做標記。還通過 extends 和 block 語句實現了模板繼承。

  • 返回字符串、列表、字典

tornado_.py

class LoginHandler(tornado.web.RequestHandler):
 
    def get(self):
        # print(self.get_argument('p'))
        self.render('login.html',**{'k1':'v1','k2':['v21','v22'],'k3':{'name':'王五','age':18}})
 
    def post(self):
        pass

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!--<link rel="stylesheet" href="/sta/commons.css" />-->
</head>
<body>
<h1>登陸</h1>

#取字符串的值
{{k1}}
#循環列表 {%for item in k2%} {{item}} {%end%} {{k3['name']}} #方法一、取name的值 {{k3.get('name')}} #方法二,取name的值

#循環字典
{%for k,v in k3.items()%}
  {{k}}-{{v}} <br>
{%end%}
</body>

</html>
  • 返回函數或者類

Tornado中返回的可以是函數或者類,分別叫做UIMethod和UIModule。

 

(1)在utils文件夾中建立如上的uimethods.py以及UIModules.py文件

uimethods.py

def display_str(self):
    print(self)   #<__main__.LoginHandler object at 0x0000000003645A20>
    return 'hello'

UIModules.py

from tornado.web import UIModule
from tornado.web import escape
 
class UILogin(UIModule):   #可以傳參數也可以不傳  UIModule中還有很多方法,可以進入查看
 
    def embedded_css(self):
 
        return 'body{color:red}' #可以添加css樣式
 
    def css_files(self):
 
        return 'css/login.css'  #可以添加css文件
 
    def render(self, *args, **kwargs):
 
        print(self,args,kwargs)
 
        # return '<h1>login</h1>'
        return escape.xhtml_escape('<h1>login</h1>') #保留標簽

(2)在settings中進行注冊,注意只需要導入文件名即可

from utils import  uimethods as mt
from utils import uimodules as md
settings={
    "static_path":"static", #這是放置靜態文件的目錄名稱
    "static_url_prefix":"/sta/",  #這是訪問靜態文件引用的url前綴
    "template_path":"templates",
    "ui_methods":mt,
    "ui_modules":md
}

(3)在模板文件中直接使用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!--<link rel="stylesheet" href="/sta/commons.css" />-->
</head>
<body>
<h1>登陸</h1>
 
{{display_str()}} <!--UIMethods-->
<br>
{% module UILogin(123) %} <!--UIModules   可以傳參數也可以不傳參數-->
 
<form method="post">
    <input type="text" name="user">
<input type="submit" value="提交">
</form>
</body>
</html> 

參考:http://www.tornadoweb.org/en/stable/guide/structure.html

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM