W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
從現(xiàn)在開始,做一個網(wǎng)站,當(dāng)然,這個網(wǎng)站只能算是一個毛坯的,可能很簡陋,但是網(wǎng)站的主要元素,它都會涉及到,讀者通過此學(xué)習(xí),能夠了解網(wǎng)站的開發(fā)基本結(jié)構(gòu)和內(nèi)容,并且對前面的知識可以有綜合應(yīng)用。
下面是一個網(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)的功能主要有:
后端
這里所說的后端,對應(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è)計):
另外,還有三個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)容。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: