中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

教你快速學會web開發之tornado

發布時間:2020-09-10 16:27:36 來源:億速云 閱讀:160 作者:Leah 欄目:編程語言

如何快速學會web開發之tornado?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

一、從 hello, world 開始

如果你的 python 環境還沒有安裝 tornado,請直接使用 pip 安裝:

pip install tornado

下面的代碼,雖然只有區區六行(不包括導入模塊的兩行),卻是一個完整的 web 服務程序。運行下面的代碼,就開啟了一個 web 服務,從本機瀏覽器直接訪問 http://127.0.0.1,不出意外的話,我們的第一個網頁 hello, world 即可正常顯示出來。

demo.py

# -*- coding: utf-8 -*-
import tornado.ioloop 
import tornado.web
class HomeHandler(tornado.web.RequestHandler): 
    def get(self): # 響應以get方式發送的請求
        self.write("hello, world") # 向請求者(瀏覽器)應答hello, world
app = tornado.web.Application([ (r"/", HomeHandler), ]) # URL映射
app.listen(80) # 綁定偵聽端口
tornado.ioloop.IOLoop.instance().start() # 啟動服務

如果多少了解一點 http 協議,知道 get / post 方法,相信你一定能夠讀懂。也許你的項目規劃了很多的url,也許你的服務需要監聽非80端口,沒有關系,在這個代碼上擴展就行。僅僅六行!!!請讓我們向犀利的、簡潔的、無所不能的 python 致敬!

劃重點:tornado.web.RequestHandler.write() 不只可以接受字符串參數,還可以接受列表或字典參數——如果應答類型為json時,這個重載特性非常高效。

二、最簡單的登錄

假定我們有這樣一個 web 服務需求:

(1)首頁:地址“/”,顯示“點此登錄”兩個漢字,點擊則跳轉到登錄頁面;

(2)登錄頁:地址“/login”,以 get 方式訪問,則顯示賬號、密碼輸入框和登錄按鈕;以 post 方式訪問,則是提交表單提交,驗證登錄信息。登錄成功,跳轉至個人信息頁面,否則,跳轉至首頁;

(3)個人信息頁:地址“/me”,顯示登錄賬號。

以上面的代碼為基礎,我們首先要做的工作是 URL 和 對應的處理類之間的關聯。這件工作實際上是非常輕松愉快的:

app = tornado.web.Application([
(r"/", HomeHandler), 
(r"/login", LoginHandler), 
(r"/me", MeHandler)
])

接下來,我們要實現 HomeHandler、LoginHandler 和 MeHandler 這三個類了。通常,我們習慣把這些和URL 對應的處理類,保存為一個獨立的文件,比如文件名為 handlers.py,然后在服務器腳本 demo.py 中導入它們。

handlers.py

# -*- coding: utf-8 -*-
import tornado.web
class HomeHandler(tornado.web.RequestHandler): 
    """響應主頁請求"""
    
    def get(self): # 以get方式請求
        self.write("""<!DOCTYPE html><html><body><a href="login">點此登錄</a></body></html>""")
class LoginHandler(tornado.web.RequestHandler): 
    """響應登錄頁請求"""
    
    def get(self): # 以get方式請求
        self.write(
            """
            <!DOCTYPE html><html><body><form method="POST" action="/login">
                賬號:<input type="text" name="account" value="" /><br />
                密碼:<input type="password" name="passwd" value="" />
                <input type="submit" value="確定" />
            </form></body></html>
            """
        )
    
    def post(self): # 以post方式請求(本例為提交表單)
        account = self.get_argument('account', None)
        passwd = self.get_argument('passwd', None)
        
        if account == 'xufive' and passwd == 'dgdgwstd':
            self.redirect('/me?name=%s'%account)
        else:
            self.redirect('/')
class MeHandler(tornado.web.RequestHandler): 
    """響應個人信息頁請求"""
    
    def get(self): # 以get方式請求
        name = self.get_argument('name', None)
        if name:
            self.write(
                """
                <!DOCTYPE html><html><head><meta charset="UTF-8" /></head>
                <body>歡迎你來到這里,%s</body></html>
                """%name
            )
        else:
            self.redirect('/')

相應地,服務腳本變成了這樣:

demo.py

# -*- coding: utf-8 -*-
import os
import tornado.ioloop 
import tornado.web
from tornado.options import parse_command_line
from handlers import *
parse_command_line()
app = tornado.web.Application(
    handlers=[
        (r"/", HomeHandler), 
        (r"/login", LoginHandler), 
        (r"/me", MeHandler)
    ],
    template_path = os.path.join(os.path.dirname(__file__), 'templates')
)
app.listen(80) # 綁定偵聽端口
tornado.ioloop.IOLoop.instance().start() # 啟動服務

劃重點:tornado.web.RequestHandler.get_argument() 可以讀取通過表單和QueryString傳遞的參數。

三、模板技術

讀到這里,你一定會覺得奇怪:為什么服務端程序里面混雜了一大堆的 html 代碼?Don’t worry,以上的代碼僅僅是幫助你建立基本概念的,實際上,tornado 是為數不多的支持模板技術很到位的框架之一,其模板技術不僅支持繼承,支持子模版。讓我們一步一步討論如何使用模板。

第1步:模板保存在哪兒?

在服務端腳本里,當我們使用 tornado.web.Application() 創建一個應用時,通常需要傳遞一個 template_path 參數,這個參數就是模板文件的保存路徑。上面的例子已經增加了這個參數,我們只要把模板文件放在和 demo.py 同級的 templates 文件夾下就可以了。

第2步:怎樣寫模板?

其實,模板就是 html 文件,只是其中混雜了少量特別約定的符號。一個 web 項目,通常由若干頁面組成,這些頁面有很多共同的地方,因此一個基類模板是必要的。

base.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <!-- 此處省略各種樣式表文件 -->
  </head>
  <body>
  {% block block_body %}{% end %}
  </body>
<html>

基類模板 base.html 定義了一個 block_body 容器,如果有必要,我們在基類模板的任意位置定義更多的容器。假定我們需要一個個人信息頁模板,可以直接繼承 base.html,然后只填寫 block_body 這一部分就行了。

me.html

{% extends "base.html" %}
{% block block_body %}
<h2>歡迎你來到這里,{{name}}</h2>
{% end %}

個人信息頁模板引中,我們使用 {{}} 引用了一個變量 name。

第3步:如何使用模板?

很簡單,前面我們用 tornado.web.RequestHandler.write() 向瀏覽器應答信息,現在則是這樣使用模板:

class MeHandler(tornado.web.RequestHandler): 
    """響應個人信息頁請求"""
    
    def get(self): # 以get方式請求
        name = self.get_argument('name', None)
        if name:
            self.render('me.html', name=name )
        else:
            self.redirect('/')

常用的模板語法匯總,如下:

(1)引用變量:{{…}}

(2)引用 python 表達式:{%…%}

(3)循環:{% for var in expr %}…{% end %}

(4)分支:{% if condition %}…{% elif condition %}…{% else %}…{% end %}

(5)引用原生表達式:{% raw expr %}

四、Cookie 演練

tornado.web.RequestHandler 的 cookie 操作非常靈活,下面的 handler 展示了 cookie 的基本讀寫方法:

class CookieHandler(tornado.web.RequestHandler):
    def get(self):
        visit_num = self.get_cookie('visit_num')
        if not visit_num:
            visit_num = '0'
        visit_num = str(int(visit_num)+1)
        #self.set_cookie('visit_num', visit_num, expires=None) # 內存cookie
        self.set_cookie('visit_num', visit_num, expires=time.time()+1000) # 持久化的cookie
        self.write("這是您第%s次訪問本頁面"%visit_num)

如果我們要使用持久化的 Cookie(硬盤 Cookie),為了防止被破解,一般是要加密的,那么,在 tornado.web.Application 中需要設置 cookie_secret 項(加密因子)。

定義tornado.web.Application,這是我最常用的一個模式:

class Application(tornado.web.Application):
    def __init__(self):
        handlers = [
            (r"/", WelcomeHandler),                # 歡迎信息
            (r"/server_time",ServerTimeHandler)    # 顯示服務器時間
        ]
        settings = dict(
            title = u"網站名稱",
            template_path = os.path.join(os.path.dirname(__file__), 'templates'),
            static_path = os.path.join(os.path.dirname(__file__), 'static'),
            cookie_secret = 'rewqr4gfd654fdsg@$%34dfs',
            session_expiry = 0,
            login_url = "/",
            debug = 1
        )
        
        tornado.web.Application.__init__(self, handlers, **settings)

五、Session 擴展

為 tornado 增加 session 機制,基本思路就是從 tornado.web.RequestHandler 派生新類,重寫 initialize() 方法。當類實例被構造函數創建后,會先運行該方法。我們定義 initialize() 方法讀取名為 session_id 的 cookie,如果存在,則讀取以 session_id 命名的 session 文件,取得 session 內容,否則,session 為空。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

莱西市| 宾川县| 随州市| 海原县| 东丽区| 丹寨县| 通许县| 屏边| 三亚市| 淮滨县| 富裕县| 黄梅县| 湾仔区| 双城市| 黔西县| 舟曲县| 安达市| 永兴县| 海南省| 大埔县| 平凉市| 台北市| 吴桥县| 大名县| 锡林郭勒盟| 樟树市| 建始县| 五原县| 疏勒县| 乃东县| 庆云县| 乌海市| 兴城市| 赫章县| 永清县| 花垣县| 原平市| 嘉鱼县| 泾源县| 沈阳市| 大田县|