鍍金池/ 教程/ Python/ 用 tornado 做網(wǎng)站 (1)
標(biāo)準(zhǔn)庫 (4)
如何成為 Python 高手
標(biāo)準(zhǔn)庫 (6)
標(biāo)準(zhǔn)庫 (3)
類(2)
Pandas 使用 (2)
xml
用 tornado 做網(wǎng)站 (5)
文件(1)
練習(xí)
列表(3)
從小工到專家
除法
錯誤和異常 (2)
函數(shù)(1)
用 tornado 做網(wǎng)站 (7)
為做網(wǎng)站而準(zhǔn)備
函數(shù)練習(xí)
標(biāo)準(zhǔn)庫 (8)
Pandas 使用 (1)
回顧 list 和 str
字典(1)
用 tornado 做網(wǎng)站 (3)
字符串(1)
函數(shù)(2)
寫一個簡單的程序
將數(shù)據(jù)存入文件
語句(5)
SQLite 數(shù)據(jù)庫
集成開發(fā)環(huán)境(IDE)
集合(1)
類(1)
用 tornado 做網(wǎng)站 (6)
用 tornado 做網(wǎng)站 (2)
自省
語句(4)
錯誤和異常 (1)
用 tornado 做網(wǎng)站 (4)
集合(2)
列表(1)
標(biāo)準(zhǔn)庫 (1)
生成器
mysql 數(shù)據(jù)庫 (1)
第三方庫
實(shí)戰(zhàn)
運(yùn)算符
類(3)
字典(2)
語句(1)
數(shù)和四則運(yùn)算
語句(2)
文件(2)
MySQL 數(shù)據(jù)庫 (2)
電子表格
迭代器
mongodb 數(shù)據(jù)庫 (1)
特殊方法 (2)
特殊方法 (1)
字符編碼
編寫模塊
用 tornado 做網(wǎng)站 (1)
標(biāo)準(zhǔn)庫 (5)
函數(shù)(4)
類(5)
字符串(2)
關(guān)于 Python 的故事
函數(shù)(3)
字符串(4)
處理股票數(shù)據(jù)
常用數(shù)學(xué)函數(shù)和運(yùn)算優(yōu)先級
字符串(3)
為計(jì)算做準(zhǔn)備
多態(tài)和封裝
類(4)
迭代
語句(3)
錯誤和異常 (3)
分析 Hello
Python 安裝
標(biāo)準(zhǔn)庫 (2)
列表(2)
元組

用 tornado 做網(wǎng)站 (1)

從現(xiàn)在開始,做一個網(wǎng)站,當(dāng)然,這個網(wǎng)站只能算是一個毛坯的,可能很簡陋,但是網(wǎng)站的主要元素,它都會涉及到,讀者通過此學(xué)習(xí),能夠了解網(wǎng)站的開發(fā)基本結(jié)構(gòu)和內(nèi)容,并且對前面的知識可以有綜合應(yīng)用。

基本結(jié)構(gòu)

下面是一個網(wǎng)站的基本結(jié)構(gòu)

http://wiki.jikexueyuan.com/project/start-learning-python/images/30301.png" alt="" />

前端

這是一個不很嚴(yán)格的說法,但是在日常開發(fā)中,都這么說。在網(wǎng)站中,所謂前端就是指用瀏覽器打開之后看到的那部分,它是呈現(xiàn)網(wǎng)站傳過來的信息的界面,也是用戶和網(wǎng)站之間進(jìn)行信息交互的界面。撰寫前端,一般使用 HTML/CSS/JS,當(dāng)然,非要用 Python 也不是不可以(例如上節(jié)中的例子,就沒有用 HTML/CSS/JS),但這勢必造成以后維護(hù)困難。

MVC 模式是一個非常好的軟件架構(gòu)模式,在網(wǎng)站開發(fā)中,也常常要求遵守這個模式。請閱讀維基百科的解釋:

MVC 模式(Model-View-Controller)是軟件工程中的一種軟件架構(gòu)模式,把軟件系統(tǒng)分為三個基本部分:模型(Model)、視圖(View)和控制器(Controller)。

MVC 模式最早由 Trygve Reenskaug 在 1978 年提出,是施樂帕羅奧多研究中心(Xerox PARC)在 20 世紀(jì) 80 年代為程序語言 Smalltalk 發(fā)明的一種軟件設(shè)計(jì)模式。MVC 模式的目的是實(shí)現(xiàn)一種動態(tài)的程式設(shè)計(jì),使后續(xù)對程序的修改和擴(kuò)展簡化,并且使程序某一部分的重復(fù)利用成為可能。除此之外,此模式通過對復(fù)雜度的簡化,使程序結(jié)構(gòu)更加直觀。軟件系統(tǒng)通過對自身基本部分分離的同時也賦予了各個基本部分應(yīng)有的功能。專業(yè)人員可以通過自身的專長分組:

  • (控制器 Controller)- 負(fù)責(zé)轉(zhuǎn)發(fā)請求,對請求進(jìn)行處理。
  • (視圖 View) - 界面設(shè)計(jì)人員進(jìn)行圖形界面設(shè)計(jì)。 -(模型 Model) - 程序員編寫程序應(yīng)有的功能(實(shí)現(xiàn)算法等等)、數(shù)據(jù)庫專家進(jìn)行數(shù)據(jù)管理和數(shù)據(jù)庫設(shè)計(jì)(可以實(shí)現(xiàn)具體的功能)。

所謂“前端”,就對大概對應(yīng)著 View 部分,之所以說是大概,因?yàn)?MVC 是站在一個軟件系統(tǒng)的角度進(jìn)行劃分的,上圖中的前后端,與其說是系統(tǒng)部分的劃分,不如嚴(yán)格說是系統(tǒng)功能的劃分。

前端所實(shí)現(xiàn)的功能主要有:

  • 呈現(xiàn)內(nèi)容。這些內(nèi)容是根據(jù) url,由后端從數(shù)據(jù)庫中提取出來的。前端將其按照一定的樣式呈現(xiàn)出來。另外,有一些內(nèi)容,不是后端數(shù)據(jù)庫提供的,是寫在前端的。
  • 用戶與網(wǎng)站交互?,F(xiàn)在的網(wǎng)站,這是必須的,比如用戶登錄。當(dāng)用戶在指定的輸入框中輸入信息之后,該信息就是被前端提交給后端,后端對這個信息進(jìn)行處理之后,在一般情況下都要再反饋給前端一個處理結(jié)果,然后前端呈現(xiàn)給用戶。

后端

這里所說的后端,對應(yīng)著 MVC 中的 Controller 和 Model 的部分或者全部功能,因?yàn)樵谖覀兊膱D中,“后端”是一個狹隘的概念,沒有把數(shù)據(jù)庫放在其內(nèi)。

不在這些術(shù)語上糾結(jié)。

在我們這里,后端就是用 Python 寫的程序。主要任務(wù)就是根據(jù)需要處理由前端發(fā)過來的各種請求,根據(jù)請求的處理結(jié)果,一方面操作數(shù)據(jù)庫(對數(shù)據(jù)庫進(jìn)行增刪改查),另外一方面把請求的處理結(jié)果反饋給前端。

數(shù)據(jù)庫

工作比較單一,就是面對后端的 Python 程序,任其增刪改查。

關(guān)于 Python 如何操作數(shù)據(jù)庫,在本教程的第貳季第柒章中已經(jīng)有詳細(xì)的敘述,請讀者閱覽。

一個基本框架

上節(jié)中,顯示了一個只能顯示一行字的網(wǎng)站,那個網(wǎng)站由于功能太單一,把所有的東西都寫到一個文件中。在真正的工程開發(fā)中,如果那么做,雖然不是不可,但開發(fā)過程和后期維護(hù)會遇到麻煩,特別是不便于多人合作。

所以,要做一個基本框架。以后網(wǎng)站就在這個框架中開發(fā)。

建立一個目錄,在這個目錄中建立一些子目錄和文件。

/.
|
handlers
|
methods
|
statics
|
templates
|
application.py
|
server.py
|
url.py

這個結(jié)構(gòu)建立好,就擺開了一個做網(wǎng)站的架勢。有了這個架勢,后面的事情就是在這個基礎(chǔ)上添加具體內(nèi)容了。當(dāng)然,還可以用另外一個更好聽的名字,稱之為設(shè)計(jì)。

依次說明上面的架勢中每個目錄和文件的作用(當(dāng)然,這個作用是我規(guī)定的,讀者如果愿意,也可以根據(jù)自己的意愿來任意設(shè)計(jì)):

  • handlers:我準(zhǔn)備在這個文件夾中放前面所說的后端 Python 程序,主要處理來自前端的請求,并且操作數(shù)據(jù)庫。
  • methods:這里準(zhǔn)備放一些函數(shù)或者類,比如用的最多的讀寫數(shù)據(jù)庫的函數(shù),這些函數(shù)被 handlers 里面的程序使用。
  • statics:這里準(zhǔn)備放一些靜態(tài)文件,比如圖片,css 和 javascript 文件等。
  • templates:這里放模板文件,都是以 html 為擴(kuò)展名的,它們將直接面對用戶。

另外,還有三個 Python 文件,依次寫下如下內(nèi)容。這些內(nèi)容的功能,已經(jīng)在上節(jié)中講過,只是這里進(jìn)行分門別類。

url.py 文件

#!/usr/bin/env Python
# coding=utf-8
"""
the url structure of website
"""

import sys     #utf-8,兼容漢字
reload(sys)
sys.setdefaultencoding("utf-8")

from handlers.index import IndexHandler    #假設(shè)已經(jīng)有了

url = [
    (r'/', IndexHandler),
]

url.py 文件主要是設(shè)置網(wǎng)站的目錄結(jié)構(gòu)。from handlers.index import IndexHandler,雖然在 handlers 文件夾還沒有什么東西,為了演示如何建立網(wǎng)站的目錄結(jié)構(gòu),假設(shè)在 handlers 文件夾里面已經(jīng)有了一個文件 index.py,它里面還有一個類 IndexHandler。在 url.py 文件中,將其引用過來。

變量 url 指向一個列表,在列表中列出所有目錄和對應(yīng)的處理類。比如 (r'/', IndexHandler),,就是約定網(wǎng)站根目錄的處理類是 IndexHandler,即來自這個目錄的 get() 或者 post() 請求,均有 IndexHandler 類中相應(yīng)方法來處理。

如果還有別的目錄,如法炮制。

application.py 文件

#!/usr/bin/env Python
# coding=utf-8

from url import url

import tornado.web
import os

settings = dict(
    template_path = os.path.join(os.path.dirname(__file__), "templates"),
    static_path = os.path.join(os.path.dirname(__file__), "statics")
    )

application = tornado.web.Application(
    handlers = url,
    **settings
    )

從內(nèi)容中可以看出,這個文件完成了對網(wǎng)站系統(tǒng)的基本配置,建立網(wǎng)站的請求處理集合。

from url import url 是將 url.py 中設(shè)定的目錄引用過來。

setting 引用了一個字典對象,里面約定了模板和靜態(tài)文件的路徑,即聲明已經(jīng)建立的文件夾"templates"和"statics"分別為模板目錄和靜態(tài)文件目錄。

接下來的 application 就是一個請求處理集合對象。請注意 tornado.web.Application() 的參數(shù)設(shè)置:

tornado.web.Application(handlers=None, default_host='', transforms=None, **settings)

關(guān)于 settings 的設(shè)置,不僅僅是文件中的兩個,還有其它,比如,如果填上 debug = True 就表示出于調(diào)試模式。調(diào)試模式的好處就在于有利于開發(fā)調(diào)試,但是,在正式部署的時候,最好不要用調(diào)試模式。其它更多的 settings 可以參看官方文檔:tornado.web-RequestHandler and Application classes

server.py 文件

這個文件的作用是將 tornado 服務(wù)器運(yùn)行起來,并且囊括前面兩個文件中的對象屬性設(shè)置。

#!/usr/bin/env Python
# coding=utf-8

import tornado.ioloop
import tornado.options
import tornado.httpserver

from application import application

from tornado.options import define, options

define("port", default = 8000, help = "run on the given port", type = int)

def main():
    tornado.options.parse_command_line()
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(options.port)

    print "Development server is running at http://127.0.0.1:%s" % options.port
    print "Quit the server with Control-C"

    tornado.ioloop.IOLoop.instance().start()

if __name__ == "__main__":
    main()

此文件中的內(nèi)容,在上節(jié)已經(jīng)介紹,不再贅述。

如此這般,就完成了網(wǎng)站架勢的搭建。

后面要做的是向里面添加內(nèi)容。


總目錄   |   上節(jié):分析 Hello   |   下節(jié):用 tornado 做網(wǎng)站 (2)

如果你認(rèn)為有必要打賞我,請通過支付寶:qiwsir@126.com,不勝感激。

上一篇:自省下一篇:列表(1)