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

2018-02-24 15:48 更新

從現(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)

前端

這是一個不很嚴(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è)計模式。MVC模式的目的是實現(xiàn)一種動態(tài)的程式設(shè)計,使后續(xù)對程序的修改和擴(kuò)展簡化,并且使程序某一部分的重復(fù)利用成為可能。除此之外,此模式通過對復(fù)雜度的簡化,使程序結(jié)構(gòu)更加直觀。軟件系統(tǒng)通過對自身基本部分分離的同時也賦予了各個基本部分應(yīng)有的功能。專業(yè)人員可以通過自身的專長分組:

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

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

前端所實現(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的部分或者全部功能,因為在我們的圖中,“后端”是一個狹隘的概念,沒有把數(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è)計。

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

  • 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)容。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號