從現(xiàn)在開始,做一個(gè)網(wǎng)站,當(dāng)然,這個(gè)網(wǎng)站只能算是一個(gè)毛坯的,可能很簡(jiǎn)陋,但是網(wǎng)站的主要元素,它都會(huì)涉及到,讀者通過此學(xué)習(xí),能夠了解網(wǎng)站的開發(fā)基本結(jié)構(gòu)和內(nèi)容,并且對(duì)前面的知識(shí)可以有綜合應(yīng)用。
下面是一個(gè)網(wǎng)站的基本結(jié)構(gòu)
http://wiki.jikexueyuan.com/project/start-learning-python/images/30301.png" alt="" />
前端
這是一個(gè)不很嚴(yán)格的說法,但是在日常開發(fā)中,都這么說。在網(wǎng)站中,所謂前端就是指用瀏覽器打開之后看到的那部分,它是呈現(xiàn)網(wǎng)站傳過來的信息的界面,也是用戶和網(wǎng)站之間進(jìn)行信息交互的界面。撰寫前端,一般使用 HTML/CSS/JS,當(dāng)然,非要用 Python 也不是不可以(例如上節(jié)中的例子,就沒有用 HTML/CSS/JS),但這勢(shì)必造成以后維護(hù)困難。
MVC 模式是一個(gè)非常好的軟件架構(gòu)模式,在網(wǎng)站開發(fā)中,也常常要求遵守這個(gè)模式。請(qǐng)閱讀維基百科的解釋:
MVC 模式(Model-View-Controller)是軟件工程中的一種軟件架構(gòu)模式,把軟件系統(tǒng)分為三個(gè)基本部分:模型(Model)、視圖(View)和控制器(Controller)。
MVC 模式最早由 Trygve Reenskaug 在 1978 年提出,是施樂帕羅奧多研究中心(Xerox PARC)在 20 世紀(jì) 80 年代為程序語言 Smalltalk 發(fā)明的一種軟件設(shè)計(jì)模式。MVC 模式的目的是實(shí)現(xiàn)一種動(dòng)態(tài)的程式設(shè)計(jì),使后續(xù)對(duì)程序的修改和擴(kuò)展簡(jiǎn)化,并且使程序某一部分的重復(fù)利用成為可能。除此之外,此模式通過對(duì)復(fù)雜度的簡(jiǎn)化,使程序結(jié)構(gòu)更加直觀。軟件系統(tǒng)通過對(duì)自身基本部分分離的同時(shí)也賦予了各個(gè)基本部分應(yīng)有的功能。專業(yè)人員可以通過自身的專長分組:
- (控制器 Controller)- 負(fù)責(zé)轉(zhuǎn)發(fā)請(qǐng)求,對(duì)請(qǐng)求進(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)具體的功能)。
所謂“前端”,就對(duì)大概對(duì)應(yīng)著 View 部分,之所以說是大概,因?yàn)?MVC 是站在一個(gè)軟件系統(tǒng)的角度進(jìn)行劃分的,上圖中的前后端,與其說是系統(tǒng)部分的劃分,不如嚴(yán)格說是系統(tǒng)功能的劃分。
前端所實(shí)現(xiàn)的功能主要有:
后端
這里所說的后端,對(duì)應(yīng)著 MVC 中的 Controller 和 Model 的部分或者全部功能,因?yàn)樵谖覀兊膱D中,“后端”是一個(gè)狹隘的概念,沒有把數(shù)據(jù)庫放在其內(nèi)。
不在這些術(shù)語上糾結(jié)。
在我們這里,后端就是用 Python 寫的程序。主要任務(wù)就是根據(jù)需要處理由前端發(fā)過來的各種請(qǐng)求,根據(jù)請(qǐng)求的處理結(jié)果,一方面操作數(shù)據(jù)庫(對(duì)數(shù)據(jù)庫進(jìn)行增刪改查),另外一方面把請(qǐng)求的處理結(jié)果反饋給前端。
數(shù)據(jù)庫
工作比較單一,就是面對(duì)后端的 Python 程序,任其增刪改查。
關(guān)于 Python 如何操作數(shù)據(jù)庫,在本教程的第貳季第柒章中已經(jīng)有詳細(xì)的敘述,請(qǐng)讀者閱覽。
上節(jié)中,顯示了一個(gè)只能顯示一行字的網(wǎng)站,那個(gè)網(wǎng)站由于功能太單一,把所有的東西都寫到一個(gè)文件中。在真正的工程開發(fā)中,如果那么做,雖然不是不可,但開發(fā)過程和后期維護(hù)會(huì)遇到麻煩,特別是不便于多人合作。
所以,要做一個(gè)基本框架。以后網(wǎng)站就在這個(gè)框架中開發(fā)。
建立一個(gè)目錄,在這個(gè)目錄中建立一些子目錄和文件。
/.
|
handlers
|
methods
|
statics
|
templates
|
application.py
|
server.py
|
url.py
這個(gè)結(jié)構(gòu)建立好,就擺開了一個(gè)做網(wǎng)站的架勢(shì)。有了這個(gè)架勢(shì),后面的事情就是在這個(gè)基礎(chǔ)上添加具體內(nèi)容了。當(dāng)然,還可以用另外一個(gè)更好聽的名字,稱之為設(shè)計(jì)。
依次說明上面的架勢(shì)中每個(gè)目錄和文件的作用(當(dāng)然,這個(gè)作用是我規(guī)定的,讀者如果愿意,也可以根據(jù)自己的意愿來任意設(shè)計(jì)):
另外,還有三個(gè) 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)有了一個(gè)文件 index.py,它里面還有一個(gè)類 IndexHandler。在 url.py 文件中,將其引用過來。
變量 url 指向一個(gè)列表,在列表中列出所有目錄和對(duì)應(yīng)的處理類。比如 (r'/', IndexHandler),,就是約定網(wǎng)站根目錄的處理類是 IndexHandler,即來自這個(gè)目錄的 get() 或者 post() 請(qǐng)求,均有 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)容中可以看出,這個(gè)文件完成了對(duì)網(wǎng)站系統(tǒng)的基本配置,建立網(wǎng)站的請(qǐng)求處理集合。
from url import url 是將 url.py 中設(shè)定的目錄引用過來。
setting 引用了一個(gè)字典對(duì)象,里面約定了模板和靜態(tài)文件的路徑,即聲明已經(jīng)建立的文件夾"templates"和"statics"分別為模板目錄和靜態(tài)文件目錄。
接下來的 application 就是一個(gè)請(qǐng)求處理集合對(duì)象。請(qǐng)注意 tornado.web.Application() 的參數(shù)設(shè)置:
tornado.web.Application(handlers=None, default_host='', transforms=None, **settings)
關(guān)于 settings 的設(shè)置,不僅僅是文件中的兩個(gè),還有其它,比如,如果填上 debug = True 就表示出于調(diào)試模式。調(diào)試模式的好處就在于有利于開發(fā)調(diào)試,但是,在正式部署的時(shí)候,最好不要用調(diào)試模式。其它更多的 settings 可以參看官方文檔:tornado.web-RequestHandler and Application classes
server.py 文件
這個(gè)文件的作用是將 tornado 服務(wù)器運(yùn)行起來,并且囊括前面兩個(gè)文件中的對(duì)象屬性設(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)站架勢(shì)的搭建。
后面要做的是向里面添加內(nèi)容。
總目錄 | 上節(jié):分析 Hello | 下節(jié):用 tornado 做網(wǎng)站 (2)
如果你認(rèn)為有必要打賞我,請(qǐng)通過支付寶:qiwsir@126.com,不勝感激。