摘要:的非阻塞單線程的特點在這個模塊中體現。還有一個模塊引入,是用完成的這兩句就顯示了所謂命令行解析模塊的用途了。表示可以接收來自的請求了。以上把一個簡單的剖析。
As he walked by the sea of Galilee, he saw two brothers, Simon, who is called Peter, and Andrew his brother, casting a net into the sea--for they were fishermen. And he said to them,"Follow me, and I will make you fish for people." Immediately they left their nets and followed him.(MATTHEW 5:18-20)
打開文本編輯器。這里要說一下啦,理論上講,所有的文本編輯器都可以做為編寫程序的工具。前面已經提到的那個python IDE,是一個很好的工具,再有別的也行,比如我就用vim(好像我的計算機只能用vim了,上次運行Libre Office都很慢,敲一個鍵之后喝口水,才看到那個字母出來,等有人資助我了,也搞一個蘋果的什么機器玩玩。)。用什么編輯工具,全是自己的喜歡罷了,不用爭論那個好,這個差,只要自己順手即可。
把下面的代碼原封不動地復制過去,并且保存為文件名是hello.py的文件,存到那個目錄中,自己選好了。
#!/usr/bin/env python #coding:utf-8 import tornado.httpserver import tornado.ioloop import tornado.options import tornado.web from tornado.options import define, options define("port", default=8000, help="run on the given port", type=int) class IndexHandler(tornado.web.RequestHandler): def get(self): greeting = self.get_argument("greeting", "Hello") self.write(greeting + ", welcome you to read: www.itdiffer.com") if __name__ == "__main__": tornado.options.parse_command_line() app = tornado.web.Application(handlers=[(r"/", IndexHandler)]) http_server = tornado.httpserver.HTTPServer(app) http_server.listen(options.port) tornado.ioloop.IOLoop.instance().start()
進入到保存hello.py文件的目錄,在shell或者命令輸入框(windows可以用cmd)中,輸入:
qw@qw-Latitude-E4300:~/codes$ python hello.py
用python運行這個文件,其實就已經發布了一個網站,只不過這個網站太簡單了。
接下來,打開瀏覽器,在瀏覽器中輸入:http://localhost:8000,得到如下界面:
當然,如果還可以在shell中用下面方式運行:
qw@qw-Latitude-E4300:~$ curl http://localhost:8000/ Hello, welcome you to read: www.itdiffer.com qw@qw-Latitude-E4300:~$ curl http://localhost:8000/?greeting=Qiwsir Qiwsir, welcome you to read: www.itdiffer.com
如果你的所有操作都正確,一定能夠看到上面的結果。
恭喜你,邁出了決定性一步,已經可以用Tornado發布網站了。在這里似乎沒有做什么部署,只是安裝了Tornado。是的,不需要如同部署Nginx或者Apache那樣,做各種設置了,因為Tornado就是一個很好的server,也是一個開發框架。
上面代碼雖然跑起來了,但是每行都什么意思呢?下面就逐行解釋,也就理解了Tornado這個框架的基本結構和用法。
WEB服務器工作流程任何一個網站都離不開Web服務器,這里所說的不是指那個更計算機一樣的硬件設備,是指里面安裝的軟件,有時候初次接觸的看官容易搞混。就來偉大的維基百科都這么說:
有時,這兩種定義會引起混淆,如Web服務器。它可能是指用于網站的計算機,也可能是指像Apache這樣的軟件,運行在這樣的計算機上以管理網頁組件和回應網頁瀏覽器的請求。
在具體的語境中,看官要注意分析,到底指的是什么。
關于Web服務器比較好的解釋,推薦看看百度百科的內容,我這里就不復制粘貼了,具體可以點擊連接查閱:WEB服務器
在WEB上,用的最多的就是輸入網址,訪問某個網站。全世界那么多網站網頁,如果去訪問他們,怎么能夠做到彼此互通互聯呢。為了協調彼此,就制定了很多通用的協議,其中http協議,就是網絡協議中的一種。關于這個協議的介紹,網上隨處就能找到,請看官自己google.
網上偷來的一張圖(從哪里偷來的,我都告訴你了,多實在呀。哈哈。),顯示在下面,簡要說明web服務器的工作過程
偷個徹底,把原文中的說明也貼上:
創建listen socket, 在指定的監聽端口, 等待客戶端請求的到來
listen socket接受客戶端的請求, 得到client socket, 接下來通過client socket與客戶端通信
處理客戶端的請求, 首先從client socket讀取http請求的協議頭, 如果是post協議, 還可能要讀取客戶端上傳的數據, 然后處理請求, 準備好客戶端需要的數據, 通過client socket寫給客戶端
剽竊就此結束,下面就自己寫了。
引入模塊import tornado.httpserver import tornado.ioloop import tornado.options import tornado.web
這四個都是Tornado的模塊,在本例中都是必須的。它們四個在一般的網站開發中,都要用到,基本作用分別是:
tornado.httpserver:這個模塊就是用來解決web服務器的http協議問題,它提供了不少屬性方法,實現客戶端和服務器端的互通。Tornado的非阻塞、單線程的特點在這個模塊中體現。
tornado.ioloop:這個也非常重要,能夠實現非阻塞socket循環,不能互通以此就結束呀。
tornado.options:這是命令行解析模塊,也常用到。
tornado.web:這是必不可少的模塊,它提供了一個簡單的Web框架與異步功能,從而使其擴展到大量打開的連接,使其成為理想的長輪詢。
還有一個模塊引入,是用from...import完成的
from tornado.options import define, options define("port", default=8000, help="run on the given port", type=int)
這兩句就顯示了所謂“命令行解析模塊”的用途了。在這里通過tornado.options.define()定義了訪問本服務器的端口,就是當在瀏覽器地址欄中輸入http:localhost:8000的時候,才能訪問本網站,因為http協議默認的端口是80,為了區分,我在這里設置為8000,為什么要區分呢?因為我的計算機或許你的也是,已經部署了別的注入Nginx服務器了,它的端口是80,所以要區分開,并且,后面我們還會將tornado和Nginx聯合起來工作,這樣兩個服務器在同一臺計算機上,就要分開嘍。
定義請求-處理程序類class IndexHandler(tornado.web.RequestHandler): def get(self): greeting = self.get_argument("greeting", "Hello") self.write(greeting + ", welcome you to read: www.itdiffer.com")
所謂“請求處理”程序類,就是要定義一個類,專門應付客戶端向服務器提出請求(這個請求也許是要讀取某個網頁,也許是要將某些信息存到服務器上),服務器要有相應的程序來接收并處理這個請求,并且反饋某些信息(或者是針對請求反饋所要的信息,或者返回其它的錯誤信息等)。
于是,就定義了一個類,名字是IndexHandler,當然,名字可以隨便取了,但是,按照習慣,類的名字中的單詞首字母都是大寫的,并且如果這個類是請求處理程序類,那么就最好用Handler結尾,這樣在名稱上很明確,是干什么的。
類IndexHandler的參數是tornado.web.RequestHandler,這個參數很重要,是專門用于完成請求處理程序的,通過它定義get()和post()兩個在web中應用最多的方法的內容(關于這兩個方法的詳細解釋,可以參考:HTTP GET POST的本質區別詳解,作者在這篇文章中,闡述了兩個方法的本質)。
在本例中,只定義了一個get()方法。請看官注意,類中的方法可以沒有別的參數,但是必須有self這個參數,關于這點請參與前面幾篇關于類的講授內容(返回首頁找相關文章)。
在greeting = self.get_argument("greeting", "Hello")這句中,當實例化之后,self對應的就是tornado.web.RequestHandler,而get_argument則是tornado.web.RequestHandler的一個方法。官方文檔對這個方法的描述如下:
RequestHandler.get_argument(name, default=, []strip=True)
Returns the value of the argument with the given name.
If default is not provided, the argument is considered to be required, and we raise a MissingArgumentError if it is missing.
If the argument appears in the url more than once, we return the last value.
The returned value is always unicode.
這段描述已經很清晰了,此外,看完這段說明,看官是否明白我在前面運行的:
qw@qw-Latitude-E4300:~$ curl http://localhost:8000/?greeting=Qiwsir Qiwsir, welcome you to read: www.itdiffer.com
為什么通過http://localhost:8000/?greeting=Qiwsir,就可以實現對greeting的賦值。
接下來的那句self.write(greeting + ",weblcome you to read: www.itdiffer.com)"中,write也是tornado.web.RequestHandler的一個方法,這發方法主要功能是向客戶端反饋參數中的信息。也瀏覽一下官方文檔信息,對以后正確理解使用有幫助:
RequestHandler.write(chunk)[source]
Writes the given chunk to the output buffer.
To write the output to the network, use the flush() method below.
main()方法If the given chunk is a dictionary, we write it as JSON and set the Content-Type of the response to be application/json. (if you want to send JSON as a different Content-Type, call set_header after calling write()).
if __name__ == "__main__",從這句話開始執行編寫的程序,前面相當于預備工作吧。這個方法跟以往執行python程序是一樣的。
tornado.options.parse_command_line(),這是在執行tornado的解析命令行。在tornado的程序中,只要import模塊之后,就會在運行的時候自動加載,不需要了解細節,但是,在main()方法中如果有命令行解析,必須要提前將模塊引入。
Application類下面這句是重點:
app = tornado.web.Application(handlers=[(r"/", IndexHandler)])
將tornado.web.Application實例化。這個實例化,本質上是建立了整個網站程序的請求處理集合,然后它可以被HTTPServer做為參數調用,實現http協議服務器訪問。Application類的__init__方法參數形式:
def __init__(self, handlers=None, default_host="", transforms=None,**settings): pass
在一般情況下,handlers是不能為空的,因為Application類通過這個參數的值處理所得到的請求。例如在本例中,handlers=[(r"/", IndexHandler)],就意味著如果通過瀏覽器的地址欄輸入根路徑(http://localhost:8000就是根路徑,如果是http://localhost:8000/qiwsir,就不屬于根,而是一個子路徑或目錄了),對應這就是讓名字為IndexHandler類處理這個請求。
通過handlers傳入的數值格式,一定要注意,在后面做復雜結構的網站是,這里就顯得重要了。它一個list,list里面的參數是列表,列表的組成包括兩部分,一部分是請求路徑,另外一部分是處理程序的類名稱。注意請求路徑可以用正則表達式書寫。舉例說明:
handlers = [ (r"/", IndexHandlers), #來自根路徑的請求用IndesHandlers處理 (r"/qiwsir/(.*)", QiwsirHandlers), #來自/qiwsir/以及其下任何請求(正則表達式表示任何字符)都由QiwsirHandlers處理 ]
注意
在這里我使用了r"/"的樣式,意味著就不需要使用轉義符,r后面的都表示該符號本來的含義。例如, ,如果單純這么來使用,就以為著換行,因為符號“”具有轉義功能(關于轉義詳細閱讀《玩轉字符串(1)》),當寫成r" "的形式是,就不再表示換行了,而是兩個字符,和n,不會轉意。一般情況下,由于正則表達式和 會有沖突,因此,當一個字符串使用了正則表達式后,最好在前面加上"r"。(關于正則表達式,看官姑且網上搜索,在后面的課程中,我也會介紹)
關于Application類的介紹,告一段落,但是并未完全講述了,因為還有別的參數設置沒有講,看官有興趣可以閱讀官方的文檔資料,地址是:http://tornado.readthedocs.org/en/latest/_modules/tornado/web.html#Application
HTTPServer類實例化之后,Application對象(用app做為標簽的)就可以被另外一個類HTTPServer引用,形式為:
http_server = tornado.httpserver.HTTPServer(app)
HTTPServer是tornado.httpserver里面定義的類。HTTPServer是一個單線程非阻塞HTTP服務器,執行HTTPServer一般要回調Application對象,并提供發送響應的接口,也就是下面的內容是跟隨上面語句的(options.port的值在IndexHandler類前面通過from...import..設置的)。
http_server.listen(options.port)
這種方法,就建立了單進程的http服務。
請看官牢記,如果在以后編碼中,遇到需要多進程,請參考官方文檔說明:http://tornado.readthedocs.org/en/latest/httpserver.html#http-server
IOLoop類剩下最后一句了:
tornado.ioloop.IOLoop.instance().start()
這句話,總是在__main()__的最后一句。表示可以接收來自HTTP的請求了。
以上把一個簡單的hello.py剖析。想必讀者對Tornado編寫網站的基本概念已經有了。
首頁???|???上一講:PYthon框架
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/37425.html
摘要:畫圈換一個說法就是循環。就相當于讓依次等于中的各個值。例找出以內的能夠被整除的正整數。以上做了簡單分析,要實現流程,還需要細化一下。代碼代碼運行結果這里僅僅列舉一個簡單的例子,看官可以在這個例子基礎上深入打印某范圍內的偶數奇數等。 畫圈?換一個說法就是循環。循環,是高級語言編程中重要的工作。現實生活中,很多事情都是在循環,日月更迭,斗轉星移,無不是循環;王朝更迭,尋常百姓,也都是循環。...
摘要:特別提醒,看官不要自宮,因為本教程不是辟邪劍譜,也不是葵花寶典,撰寫本課程的人更是生理健全者。直到目前,科學上尚未有證實或證偽自宮和寫程序之間是否存在某種因果關系。和是中用的最多的方法啦。 Do not store up for yourselves treasures on earth, where moth and rust consume and where thieves...
摘要:字符串是一個很長的話題,縱然現在開始第三部分,但是也不能完全說盡。字符串就是一個話題中心。也就是和是指向同一個字符。字符串截取有了編號,不僅僅能夠找出某個字符,還能在字符串中取出一部分來。 字符串是一個很長的話題,縱然現在開始第三部分,但是也不能完全說盡。因為字符串是自然語言中最復雜的東西,也是承載功能最多的,計算機高級語言編程,要解決自然語言中的問題,讓自然語言中完成的事情在計算機上...
摘要:楚江數據是專業的互聯網數據技術服務,現整理出零基礎如何學爬蟲技術以供學習,。本文來源知乎作者路人甲鏈接楚江數據提供網站數據采集和爬蟲軟件定制開發服務,服務范圍涵蓋社交網絡電子商務分類信息學術研究等。 楚江數據是專業的互聯網數據技術服務,現整理出零基礎如何學爬蟲技術以供學習,http://www.chujiangdata.com。 第一:Python爬蟲學習系列教程(來源于某博主:htt...
摘要:一提到計算機,當然現在更多人把她叫做電腦,這兩個詞都是指。乃至于,有的人在口語中區分不開計算機和計算器。那么,做為零基礎學習這,也就從計算小學數學題目開始吧。因為從這里開始,數學的基礎知識列為肯定過關了。 一提到計算機,當然現在更多人把她叫做電腦,這兩個詞都是指computer。不管什么,只要提到她,普遍都會想到她能夠比較快地做加減乘除,甚至乘方開方等。乃至于,有的人在口語中區分不開計...
閱讀 1066·2021-11-12 10:34
閱讀 996·2021-09-30 09:56
閱讀 674·2019-08-30 15:54
閱讀 2608·2019-08-30 11:14
閱讀 1473·2019-08-29 16:44
閱讀 3212·2019-08-29 16:35
閱讀 2498·2019-08-29 16:22
閱讀 2448·2019-08-29 15:39