目錄
Burt's Books
首頁 後端開發 Python教學 使用Python的Tornado框架實作一個Web端圖書展示頁面

使用Python的Tornado框架實作一個Web端圖書展示頁面

Aug 04, 2016 am 08:55 AM
python tornado

首先,為什麼選擇Tornado:
1.高效能的網路庫,這可以和gevent,twisted,libevent等做對。
提供了非同步io支持,超時事件處理,在此基礎上提供了tcpserver,httpclient,尤其是curlhttpclient,
在現有http客戶端肯定排第一。可以用來做爬蟲,遊戲伺服器,據我所知業界已有使用tornado作為遊戲伺服器

2.web框架,這可以和django,flask對。
提供了路由,模板等web框架必備組件。與其他區別是tornado是異步的,天然適合長輪訓,
這也是friendfeed發明tornado的原因,目前flask也可以支持,但必須藉助gevent等

3.較為完整的http伺服器,這點可以和nginx,apache對比,
但只支援http1.0,所以用nginx做前段不僅是為了更好利用多核,也是讓其支持http1.1

4.完整的wsgi伺服器,這可以和gunicore,gevent wsgi server做對比,
也就是說可以讓flask運作在tornado之上,讓tornado加速flask

5.提供了完整的websocket支持,這讓html5的遊戲等提供了便利。
像知乎長輪訓就是使用了websocket,但websocket手機支援的不是很好,
前段時間不得不使用定時ajax發送大量請求,期待手機瀏覽器趕快奮起直追

使用tornado建立一個簡單的圖書介紹頁
好了,言歸正傳,下面我們來看看這個圖書介紹頁的程式碼實作:
1.建立一個web服務的入口檔案 blockmain.py

#coding:utf-8
import tornado.web
import tornado.httpserver
import tornado.ioloop
import tornado.options
import os.path
import json
import urllib2

from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)

class MainHandler(tornado.web.RequestHandler):
  def get(self):
    self.render(
      "index.html",
      page_title = "Burt's Books ¦ Home",
      header_text = "Welcome to Burt's Books!",
      books = ['细说php','python','PHP','小时代']
    )


class HelloModule(tornado.web.UIModule):
  def render(self):
    return'<h1>I am yyx and this is an information from module hello!</h1>'

class BookModule(tornado.web.UIModule):
  def render(self,bookname):
    doubanapi = r'https://api.douban.com/v2/book/'
    searchapi = r'https://api.douban.com/v2/book/search&#63;q='
    searchurl = searchapi+bookname
    searchresult = urllib2.urlopen(searchurl).read()
    bookid = json.loads(searchresult)['books'][0]['id']
    bookurl = doubanapi+bookid
    injson = urllib2.urlopen(bookurl).read()
    bookinfo = json.loads(injson)
    return self.render_string('modules/book.html',book = bookinfo)

  def embedded_javascript(self):
    return "document.write(\"hi!\")"

  def embedded_css(self):
    return '''.book {background-color:#F5F5F5}
         .book_body{color:red}
    '''

  def html_body(self):
    return '<script>document.write("Hello!")</script>'

if __name__ == "__main__":
  tornado.options.parse_command_line()
  app = tornado.web.Application(
    handlers = [
      (r'/',MainHandler),

    ],
    template_path = os.path.join(os.path.dirname(__file__),'templates'),
    static_path = os.path.join(os.path.dirname(__file__),'static'),
    debug = True,
    ui_modules={'Hello':HelloModule,'Book':BookModule}


    )
  http_server = tornado.httpserver.HTTPServer(app)
  http_server.listen(options.port)
  tornado.ioloop.IOLoop.instance().start()

登入後複製

說明一下,一些基本的MVC概念:
tornado也是透過pathinfo模式來匹配使用者的輸入來獲得參數,然後再呼叫對應的處理函數,它是透過為各種匹配模式設定對應的class類別來處理,例如我這裡就是透過class MainHandler來處理來自/的get請求
MainHandler把請求render渲染到index.html,參數在index.html中透過{{參數}}來呼叫

2.建立對應的模板,先建立一個基礎的父類main.html模板,創建templates目錄,在它下面創建main.html,這個模板只是定義了最基礎的網頁框架,裡面的具體內容由繼承於它的子類別來具體實作

<html>
<head>
  <title>{{ page_title }}</title>
  <link rel="stylesheet" href="{{ static_url("css/style.css") }}" />
</head>
<body>
  <div id="container">
    <header>
      {% block header %}<h1>Burt's Books</h1>{% end %}
    </header>
    <div id="main">
      <div id="content">
        {% block body %}{% end %}
      </div>
    </div>
    <footer>
      {% set mailLink = '<a href="mailto:contact@burtsbooks.com">Contact Us</a>' %}
      {% set script = '<script>alert("hello")</script>' %}
      {% block footer %}

        <p>
          For more information about our selection, hours or events, please email us at{% raw mailLink %}

          <!-- {% raw script %} 这里将原样输出,也就是会弹一个框--> 
        </p>
      {% end %}
    </footer>
  </div>
  <script src="{{ static_url("js/script.js") }}"></script>
  </body>
</html>

登入後複製

這裡是定義了一個主框架,其中裡面的{% block header %}

Burt's Books

{% end %}是為了子類別模板的繼承的區塊(block),當子類別繼承了這個main.html,具體這個區塊裡寫什麼內容由子類別來實現,不實現的話就使用父類別的預設值,如是這裡的

Burt's Books

,MainHandler類別是render到一個index. html,那接下來寫一個index.html來繼承這個父類別

{% extends "main.html" %}

{% block header %}
  <h1>{{ header_text }}</h1>
{% end %}

{% block body %}
  <div id="hello">
    <p>Welcome to Burt's Books!</p>
    {% module Hello() %}

    {% for book in books %}
      {% module Book(book) %}
    {% end %}
    <p>...</p>
  </div>
{% end %}

登入後複製

簡單簡潔吧,這也是使用了繼承的好處,不用再重複寫父類的東西,只要實現父類的block內容即可
MainHandler類別裡的render方法中的參數

page_title = "Burt's Books | Home",
header_text = "Welcome to Burt's Books!",
books = ['细说php','python','PHP','小时代']
登入後複製

將會透過參數傳送到這裡來
tornado的模板裡可以使用python的程式碼,加上{% %}當使用if for while等要用{% end %}結尾
程式碼中{% module Book(book) %} 將會呼叫入口服務檔案中的定義和'Book'所對應的模組
ui_modules={'Hello':HelloModule,'Book':BookModule} 也就是BookModule,看上面的BookModule定義

class BookModule(tornado.web.UIModule):
  def render(self,bookname):
    doubanapi = r'https://api.douban.com/v2/book/'
    searchapi = r'https://api.douban.com/v2/book/search&#63;q='
    searchurl = searchapi+bookname
    searchresult = urllib2.urlopen(searchurl).read()
    bookid = json.loads(searchresult)['books'][0]['id']
    bookurl = doubanapi+bookid
    injson = urllib2.urlopen(bookurl).read()
    bookinfo = json.loads(injson)
    return self.render_string('modules/book.html',book = bookinfo)
登入後複製

BookModule 繼承自tornado.web.UIModule,UI模組的使用是最後render_string()方法來把一個物件渲染到一個模板中去,我這裡簡單的使用了豆瓣的圖書api,先透過search來查詢一下包含關鍵詞的圖書信息,返回第一條圖書的id,再使用book api來查詢該圖書的具體信息,將這個具體圖書的信息render到對應的模板
在templates 目錄下建立modules目錄,再下建立一個book.html,這裡是具體的book要顯示的內容框架

<div class="book">
  <h3 class="book_title">{{ book["title"] }}</h3>
  <a href="{{book['alt']}}" target="_blank"><p>点击查看详情</p></a>
  {% if book["subtitle"] != "" %}
    <h4 class="book_subtitle">{{ book["subtitle"] }}</h4>
  {% end %}
  <img src="{{ book["images"]["large"] }}" class="book_image"/>
  <div class="book_details">
    <div class="book_date_released">Released: {{ book["pubdate"]}}</div>    
    <h5>Description:</h5>
    <div class="book_body">{% raw book["summary"] %}</div>
  </div>
</div>
登入後複製

最後的檔案目錄結構應該是這樣的

├── blockmain.py
└── templates
  ├── index.html
  ├── main.html
  └── modules
    └── book.html
登入後複製

程式的執行是這樣的:
先透過路徑'/'來使用MainHandler類別存取index.html---->index.html繼承自main.html---->index.html中的{% module Book(book) %}反過來查找blockmain .py中的Book對應的ui_modules---->ui_modules中將查詢得到的book物件內容渲染到modules下的book.html中,這樣就把完整的內容呈現出來了,沒有做前端… 透過python blockmain .py啟動服務,透過http://localhost:8000 來存取得到如下的網頁

2016711175031811.png (913×639)

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1665
14
CakePHP 教程
1424
52
Laravel 教程
1322
25
PHP教程
1270
29
C# 教程
1249
24
PHP和Python:解釋了不同的範例 PHP和Python:解釋了不同的範例 Apr 18, 2025 am 12:26 AM

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

在PHP和Python之間進行選擇:指南 在PHP和Python之間進行選擇:指南 Apr 18, 2025 am 12:24 AM

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

sublime怎麼運行代碼python sublime怎麼運行代碼python Apr 16, 2025 am 08:48 AM

在 Sublime Text 中運行 Python 代碼,需先安裝 Python 插件,再創建 .py 文件並編寫代碼,最後按 Ctrl B 運行代碼,輸出會在控制台中顯示。

Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

PHP和Python:深入了解他們的歷史 PHP和Python:深入了解他們的歷史 Apr 18, 2025 am 12:25 AM

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

Golang vs. Python:性能和可伸縮性 Golang vs. Python:性能和可伸縮性 Apr 19, 2025 am 12:18 AM

Golang在性能和可擴展性方面優於Python。 1)Golang的編譯型特性和高效並發模型使其在高並發場景下表現出色。 2)Python作為解釋型語言,執行速度較慢,但通過工具如Cython可優化性能。

vscode在哪寫代碼 vscode在哪寫代碼 Apr 15, 2025 pm 09:54 PM

在 Visual Studio Code(VSCode)中編寫代碼簡單易行,只需安裝 VSCode、創建項目、選擇語言、創建文件、編寫代碼、保存並運行即可。 VSCode 的優點包括跨平台、免費開源、強大功能、擴展豐富,以及輕量快速。

notepad 怎麼運行python notepad 怎麼運行python Apr 16, 2025 pm 07:33 PM

在 Notepad 中運行 Python 代碼需要安裝 Python 可執行文件和 NppExec 插件。安裝 Python 並為其添加 PATH 後,在 NppExec 插件中配置命令為“python”、參數為“{CURRENT_DIRECTORY}{FILE_NAME}”,即可在 Notepad 中通過快捷鍵“F6”運行 Python 代碼。

See all articles