從現在開始,做一個網站,當然,這個網站只能算是一個毛坯的,可能很簡陋,但是網站的主要元素,它都會涉及到,讀者通過此學習,能夠了解網站的開發基本結構和內容,并且對前面的知識可以有綜合應用。
## [](https://github.com/qiwsir/StarterLearningPython/blob/master/303.md#基本結構)基本結構
下面是一個網站的基本結構
[](https://github.com/qiwsir/StarterLearningPython/blob/master/3images/30301.png)
**前端**
這是一個不很嚴格的說法,但是在日常開發中,都這么說。在網站中,所謂前端就是指用瀏覽器打開之后看到的那部分,它是呈現網站傳過來的信息的界面,也是用戶和網站之間進行信息交互的界面。撰寫前端,一般使用HTML/CSS/JS,當然,非要用python也不是不可以(例如上節中的例子,就沒有用HTML/CSS/JS),但這勢必造成以后維護困難。
MVC模式是一個非常好的軟件架構模式,在網站開發中,也常常要求遵守這個模式。請閱讀維基百科的解釋:
> MVC模式(Model-View-Controller)是軟件工程中的一種軟件架構模式,把軟件系統分為三個基本部分:模型(Model)、視圖(View)和控制器(Controller)。
>
> MVC模式最早由Trygve Reenskaug在1978年提出,是施樂帕羅奧多研究中心(Xerox PARC)在20世紀80年代為程序語言Smalltalk發明的一種軟件設計模式。MVC模式的目的是實現一種動態的程式設計,使后續對程序的修改和擴展簡化,并且使程序某一部分的重復利用成為可能。除此之外,此模式通過對復雜度的簡化,使程序結構更加直觀。軟件系統通過對自身基本部分分離的同時也賦予了各個基本部分應有的功能。專業人員可以通過自身的專長分組:
>
> * (控制器 Controller)- 負責轉發請求,對請求進行處理。
> * (視圖 View) - 界面設計人員進行圖形界面設計。 -(模型 Model) - 程序員編寫程序應有的功能(實現算法等等)、數據庫專家進行數據管理和數據庫設計(可以實現具體的功能)。
所謂“前端”,就對大概對應著View部分,之所以說是大概,因為MVC是站在一個軟件系統的角度進行劃分的,上圖中的前后端,與其說是系統部分的劃分,不如嚴格說是系統功能的劃分。
前端所實現的功能主要有:
* 呈現內容。這些內容是根據url,由后端從數據庫中提取出來的。前端將其按照一定的樣式呈現出來。另外,有一些內容,不是后端數據庫提供的,是寫在前端的。
* 用戶與網站交互。現在的網站,這是必須的,比如用戶登錄。當用戶在指定的輸入框中輸入信息之后,該信息就是被前端提交給后端,后端對這個信息進行處理之后,在一般情況下都要再反饋給前端一個處理結果,然后前端呈現給用戶。
**后端**
這里所說的后端,對應著MVC中的Controller和Model的部分或者全部功能,因為在我們的圖中,“后端”是一個狹隘的概念,沒有把數據庫放在其內。
不在這些術語上糾結。
在我們這里,后端就是用python寫的程序。主要任務就是根據需要處理由前端發過來的各種請求,根據請求的處理結果,一方面操作數據庫(對數據庫進行增刪改查),另外一方面把請求的處理結果反饋給前端。
**數據庫**
工作比較單一,就是面對后端的python程序,任其增刪改查。
關于python如何操作數據庫,在本教程的第貳季第柒章中已經有詳細的敘述,請讀者閱覽。
## [](https://github.com/qiwsir/StarterLearningPython/blob/master/303.md#一個基本框架)一個基本框架
上節中,顯示了一個只能顯示一行字的網站,那個網站由于功能太單一,把所有的東西都寫到一個文件中。在真正的工程開發中,如果那么做,雖然不是不可,但開發過程和后期維護會遇到麻煩,特別是不便于多人合作。
所以,要做一個基本框架。以后網站就在這個框架中開發。
建立一個目錄,在這個目錄中建立一些子目錄和文件。
~~~
/.
|
handlers
|
methods
|
statics
|
templates
|
application.py
|
server.py
|
url.py
~~~
這個結構建立好,就擺開了一個做網站的架勢。有了這個架勢,后面的事情就是在這個基礎上添加具體內容了。當然,還可以用另外一個更好聽的名字,稱之為設計。
依次說明上面的架勢中每個目錄和文件的作用(當然,這個作用是我規定的,讀者如果愿意,也可以根據自己的意愿來任意設計):
* handlers:我準備在這個文件夾中放前面所說的后端python程序,主要處理來自前端的請求,并且操作數據庫。
* methods:這里準備放一些函數或者類,比如用的最多的讀寫數據庫的函數,這些函數被handlers里面的程序使用。
* statics:這里準備放一些靜態文件,比如圖片,css和javascript文件等。
* templates:這里放模板文件,都是以html為擴展名的,它們將直接面對用戶。
另外,還有三個python文件,依次寫下如下內容。這些內容的功能,已經在上節中講過,只是這里進行分門別類。
**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 #假設已經有了
url = [
(r'/', IndexHandler),
]
~~~
url.py文件主要是設置網站的目錄結構。`from handlers.index import IndexHandler`,雖然在handlers文件夾還沒有什么東西,為了演示如何建立網站的目錄結構,假設在handlers文件夾里面已經有了一個文件index.py,它里面還有一個類IndexHandler。在url.py文件中,將其引用過來。
變量url指向一個列表,在列表中列出所有目錄和對應的處理類。比如`(r'/', IndexHandler),`,就是約定網站根目錄的處理類是IndexHandler,即來自這個目錄的get()或者post()請求,均有IndexHandler類中相應方法來處理。
如果還有別的目錄,如法炮制。
**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
)
~~~
從內容中可以看出,這個文件完成了對網站系統的基本配置,建立網站的請求處理集合。
`from url import url`是將url.py中設定的目錄引用過來。
setting引用了一個字典對象,里面約定了模板和靜態文件的路徑,即聲明已經建立的文件夾"templates"和"statics"分別為模板目錄和靜態文件目錄。
接下來的application就是一個請求處理集合對象。請注意`tornado.web.Application()`的參數設置:
> tornado.web.Application(handlers=None, default_host='', transforms=None, **settings)
關于settings的設置,不僅僅是文件中的兩個,還有其它,比如,如果填上`debug = True`就表示出于調試模式。調試模式的好處就在于有利于開發調試,但是,在正式部署的時候,最好不要用調試模式。其它更多的settings可以參看官方文檔:[tornado.web-RequestHandler and Application classes](http://tornado.readthedocs.org/en/latest/web.html)
**server.py**文件
這個文件的作用是將tornado服務器運行起來,并且囊括前面兩個文件中的對象屬性設置。
~~~
#!/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()
~~~
此文件中的內容,在[上節](https://github.com/qiwsir/StarterLearningPython/blob/master/302.md)已經介紹,不再贅述。
如此這般,就完成了網站架勢的搭建。
后面要做的是向里面添加內容。
- 第零章 預備
- 關于Python的故事
- 從小工到專家
- Python安裝
- 集成開發環境
- 第壹章 基本數據類型
- 數和四則運算
- 除法
- 常用數學函數和運算優先級
- 寫一個簡單的程序
- 字符串(1)
- 字符串(2)
- 字符串(3)
- 字符串(4)
- 字符編碼
- 列表(1)
- 列表(2)
- 列表(3)
- 回顧list和str
- 元組
- 字典(1)
- 字典(2)
- 集合(1)
- 集合(2)
- 第貳章 語句和文件
- 運算符
- 語句(1)
- 語句(2)
- 語句(3)
- 語句(4)
- 語句(5)
- 文件(1)
- 文件(2)
- 迭代
- 練習
- 自省
- 第叁章 函數
- 函數(1)
- 函數(2)
- 函數(3)
- 函數(4)
- 函數練習
- 第肆章 類
- 類(1)
- 類(2)
- 類(3)
- 類(4)
- 類(5)
- 多態和封裝
- 特殊方法(1)
- 特殊方法(2)
- 迭代器
- 生成器
- 上下文管理器
- 第伍章 錯誤和異常
- 錯誤和異常(1)
- 錯誤和異常(2)
- 錯誤和異常(3)
- 第陸章 模塊
- 編寫模塊
- 標準庫(1)
- 標準庫(2)
- 標準庫(3)
- 標準庫(4)
- 標準庫(5)
- 標準庫(6)
- 標準庫(7)
- 標準庫(8)
- 第三方庫
- 第柒章 保存數據
- 將數據存入文件
- mysql數據庫(1)
- MySQL數據庫(2)
- mongodb數據庫(1)
- SQLite數據庫
- 電子表格
- 第捌章 用Tornado做網站
- 為做網站而準備
- 分析Hello
- 用tornado做網站(1)
- 用tornado做網站(2)
- 用tornado做網站(3)
- 用tornado做網站(4)
- 用tornado做網站(5)
- 用tornado做網站(6)
- 用tornado做網站(7)
- 第玖章 科學計算
- 為計算做準備
- Pandas使用(1)
- Pandas使用(2)
- 處理股票數據
- 附:網絡文摘
- 如何成為Python高手
- ASCII、Unicode、GBK和UTF-8字符編碼的區別聯系