国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

[零基礎(chǔ)學(xué)python]Hello,第一個(gè)網(wǎng)頁分析

Steve_Wang_ / 3270人閱讀

摘要:的非阻塞單線程的特點(diǎn)在這個(gè)模塊中體現(xiàn)。還有一個(gè)模塊引入,是用完成的這兩句就顯示了所謂命令行解析模塊的用途了。表示可以接收來自的請(qǐng)求了。以上把一個(gè)簡(jiǎn)單的剖析。

  

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)

打開文本編輯器。這里要說一下啦,理論上講,所有的文本編輯器都可以做為編寫程序的工具。前面已經(jīng)提到的那個(gè)python IDE,是一個(gè)很好的工具,再有別的也行,比如我就用vim(好像我的計(jì)算機(jī)只能用vim了,上次運(yùn)行Libre Office都很慢,敲一個(gè)鍵之后喝口水,才看到那個(gè)字母出來,等有人資助我了,也搞一個(gè)蘋果的什么機(jī)器玩玩。)。用什么編輯工具,全是自己的喜歡罷了,不用爭(zhēng)論那個(gè)好,這個(gè)差,只要自己順手即可。

把下面的代碼原封不動(dòng)地復(fù)制過去,并且保存為文件名是hello.py的文件,存到那個(gè)目錄中,自己選好了。

#!/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()

進(jìn)入到保存hello.py文件的目錄,在shell或者命令輸入框(windows可以用cmd)中,輸入:

qw@qw-Latitude-E4300:~/codes$ python hello.py

用python運(yùn)行這個(gè)文件,其實(shí)就已經(jīng)發(fā)布了一個(gè)網(wǎng)站,只不過這個(gè)網(wǎng)站太簡(jiǎn)單了。

接下來,打開瀏覽器,在瀏覽器中輸入:http://localhost:8000,得到如下界面:

當(dāng)然,如果還可以在shell中用下面方式運(yùn)行:

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 

如果你的所有操作都正確,一定能夠看到上面的結(jié)果。

恭喜你,邁出了決定性一步,已經(jīng)可以用Tornado發(fā)布網(wǎng)站了。在這里似乎沒有做什么部署,只是安裝了Tornado。是的,不需要如同部署Nginx或者Apache那樣,做各種設(shè)置了,因?yàn)門ornado就是一個(gè)很好的server,也是一個(gè)開發(fā)框架。

上面代碼雖然跑起來了,但是每行都什么意思呢?下面就逐行解釋,也就理解了Tornado這個(gè)框架的基本結(jié)構(gòu)和用法。

WEB服務(wù)器工作流程

任何一個(gè)網(wǎng)站都離不開Web服務(wù)器,這里所說的不是指那個(gè)更計(jì)算機(jī)一樣的硬件設(shè)備,是指里面安裝的軟件,有時(shí)候初次接觸的看官容易搞混。就來偉大的維基百科都這么說:

  

有時(shí),這兩種定義會(huì)引起混淆,如Web服務(wù)器。它可能是指用于網(wǎng)站的計(jì)算機(jī),也可能是指像Apache這樣的軟件,運(yùn)行在這樣的計(jì)算機(jī)上以管理網(wǎng)頁組件和回應(yīng)網(wǎng)頁瀏覽器的請(qǐng)求。

在具體的語境中,看官要注意分析,到底指的是什么。

關(guān)于Web服務(wù)器比較好的解釋,推薦看看百度百科的內(nèi)容,我這里就不復(fù)制粘貼了,具體可以點(diǎn)擊連接查閱:WEB服務(wù)器

在WEB上,用的最多的就是輸入網(wǎng)址,訪問某個(gè)網(wǎng)站。全世界那么多網(wǎng)站網(wǎng)頁,如果去訪問他們,怎么能夠做到彼此互通互聯(lián)呢。為了協(xié)調(diào)彼此,就制定了很多通用的協(xié)議,其中http協(xié)議,就是網(wǎng)絡(luò)協(xié)議中的一種。關(guān)于這個(gè)協(xié)議的介紹,網(wǎng)上隨處就能找到,請(qǐng)看官自己google.

網(wǎng)上偷來的一張圖(從哪里偷來的,我都告訴你了,多實(shí)在呀。哈哈。),顯示在下面,簡(jiǎn)要說明web服務(wù)器的工作過程

偷個(gè)徹底,把原文中的說明也貼上:

創(chuàng)建listen socket, 在指定的監(jiān)聽端口, 等待客戶端請(qǐng)求的到來

listen socket接受客戶端的請(qǐng)求, 得到client socket, 接下來通過client socket與客戶端通信

處理客戶端的請(qǐng)求, 首先從client socket讀取http請(qǐng)求的協(xié)議頭, 如果是post協(xié)議, 還可能要讀取客戶端上傳的數(shù)據(jù), 然后處理請(qǐng)求, 準(zhǔn)備好客戶端需要的數(shù)據(jù), 通過client socket寫給客戶端

剽竊就此結(jié)束,下面就自己寫了。

引入模塊
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web

這四個(gè)都是Tornado的模塊,在本例中都是必須的。它們四個(gè)在一般的網(wǎng)站開發(fā)中,都要用到,基本作用分別是:

tornado.httpserver:這個(gè)模塊就是用來解決web服務(wù)器的http協(xié)議問題,它提供了不少屬性方法,實(shí)現(xiàn)客戶端和服務(wù)器端的互通。Tornado的非阻塞、單線程的特點(diǎn)在這個(gè)模塊中體現(xiàn)。

tornado.ioloop:這個(gè)也非常重要,能夠?qū)崿F(xiàn)非阻塞socket循環(huán),不能互通以此就結(jié)束呀。

tornado.options:這是命令行解析模塊,也常用到。

tornado.web:這是必不可少的模塊,它提供了一個(gè)簡(jiǎn)單的Web框架與異步功能,從而使其擴(kuò)展到大量打開的連接,使其成為理想的長(zhǎng)輪詢。

還有一個(gè)模塊引入,是用from...import完成的

from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)

這兩句就顯示了所謂“命令行解析模塊”的用途了。在這里通過tornado.options.define()定義了訪問本服務(wù)器的端口,就是當(dāng)在瀏覽器地址欄中輸入http:localhost:8000的時(shí)候,才能訪問本網(wǎng)站,因?yàn)閔ttp協(xié)議默認(rèn)的端口是80,為了區(qū)分,我在這里設(shè)置為8000,為什么要區(qū)分呢?因?yàn)槲业挠?jì)算機(jī)或許你的也是,已經(jīng)部署了別的注入Nginx服務(wù)器了,它的端口是80,所以要區(qū)分開,并且,后面我們還會(huì)將tornado和Nginx聯(lián)合起來工作,這樣兩個(gè)服務(wù)器在同一臺(tái)計(jì)算機(jī)上,就要分開嘍。

定義請(qǐng)求-處理程序類
class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        greeting = self.get_argument("greeting", "Hello")
        self.write(greeting + ", welcome you to read: www.itdiffer.com")

所謂“請(qǐng)求處理”程序類,就是要定義一個(gè)類,專門應(yīng)付客戶端向服務(wù)器提出請(qǐng)求(這個(gè)請(qǐng)求也許是要讀取某個(gè)網(wǎng)頁,也許是要將某些信息存到服務(wù)器上),服務(wù)器要有相應(yīng)的程序來接收并處理這個(gè)請(qǐng)求,并且反饋某些信息(或者是針對(duì)請(qǐng)求反饋所要的信息,或者返回其它的錯(cuò)誤信息等)。

于是,就定義了一個(gè)類,名字是IndexHandler,當(dāng)然,名字可以隨便取了,但是,按照習(xí)慣,類的名字中的單詞首字母都是大寫的,并且如果這個(gè)類是請(qǐng)求處理程序類,那么就最好用Handler結(jié)尾,這樣在名稱上很明確,是干什么的。

類IndexHandler的參數(shù)是tornado.web.RequestHandler,這個(gè)參數(shù)很重要,是專門用于完成請(qǐng)求處理程序的,通過它定義get()post()兩個(gè)在web中應(yīng)用最多的方法的內(nèi)容(關(guān)于這兩個(gè)方法的詳細(xì)解釋,可以參考:HTTP GET POST的本質(zhì)區(qū)別詳解,作者在這篇文章中,闡述了兩個(gè)方法的本質(zhì))。

在本例中,只定義了一個(gè)get()方法。請(qǐng)看官注意,類中的方法可以沒有別的參數(shù),但是必須有self這個(gè)參數(shù),關(guān)于這點(diǎn)請(qǐng)參與前面幾篇關(guān)于類的講授內(nèi)容(返回首頁找相關(guān)文章)。

greeting = self.get_argument("greeting", "Hello")這句中,當(dāng)實(shí)例化之后,self對(duì)應(yīng)的就是tornado.web.RequestHandler,而get_argument則是tornado.web.RequestHandler的一個(gè)方法。官方文檔對(duì)這個(gè)方法的描述如下:

  

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.

這段描述已經(jīng)很清晰了,此外,看完這段說明,看官是否明白我在前面運(yùn)行的:

qw@qw-Latitude-E4300:~$ curl http://localhost:8000/?greeting=Qiwsir
Qiwsir, welcome you to read: www.itdiffer.com 

為什么通過http://localhost:8000/?greeting=Qiwsir,就可以實(shí)現(xiàn)對(duì)greeting的賦值。

接下來的那句self.write(greeting + ",weblcome you to read: www.itdiffer.com)"中,write也是tornado.web.RequestHandler的一個(gè)方法,這發(fā)方法主要功能是向客戶端反饋參數(shù)中的信息。也瀏覽一下官方文檔信息,對(duì)以后正確理解使用有幫助:

  

RequestHandler.write(chunk)[source]

  
    

Writes the given chunk to the output buffer.

  
    

To write the output to the network, use the flush() method below.

  
    

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()).

main()方法

if __name__ == "__main__",從這句話開始執(zhí)行編寫的程序,前面相當(dāng)于預(yù)備工作吧。這個(gè)方法跟以往執(zhí)行python程序是一樣的。

tornado.options.parse_command_line(),這是在執(zhí)行tornado的解析命令行。在tornado的程序中,只要import模塊之后,就會(huì)在運(yùn)行的時(shí)候自動(dòng)加載,不需要了解細(xì)節(jié),但是,在main()方法中如果有命令行解析,必須要提前將模塊引入。

Application類

下面這句是重點(diǎn):

app = tornado.web.Application(handlers=[(r"/", IndexHandler)])

將tornado.web.Application實(shí)例化。這個(gè)實(shí)例化,本質(zhì)上是建立了整個(gè)網(wǎng)站程序的請(qǐng)求處理集合,然后它可以被HTTPServer做為參數(shù)調(diào)用,實(shí)現(xiàn)http協(xié)議服務(wù)器訪問。Application類的__init__方法參數(shù)形式:

def __init__(self, handlers=None, default_host="", transforms=None,**settings):
    pass

在一般情況下,handlers是不能為空的,因?yàn)锳pplication類通過這個(gè)參數(shù)的值處理所得到的請(qǐng)求。例如在本例中,handlers=[(r"/", IndexHandler)],就意味著如果通過瀏覽器的地址欄輸入根路徑(http://localhost:8000就是根路徑,如果是http://localhost:8000/qiwsir,就不屬于根,而是一個(gè)子路徑或目錄了),對(duì)應(yīng)這就是讓名字為IndexHandler類處理這個(gè)請(qǐng)求。

通過handlers傳入的數(shù)值格式,一定要注意,在后面做復(fù)雜結(jié)構(gòu)的網(wǎng)站是,這里就顯得重要了。它一個(gè)list,list里面的參數(shù)是列表,列表的組成包括兩部分,一部分是請(qǐng)求路徑,另外一部分是處理程序的類名稱。注意請(qǐng)求路徑可以用正則表達(dá)式書寫。舉例說明:

handlers = [
    (r"/", IndexHandlers),              #來自根路徑的請(qǐng)求用IndesHandlers處理
    (r"/qiwsir/(.*)", QiwsirHandlers),  #來自/qiwsir/以及其下任何請(qǐng)求(正則表達(dá)式表示任何字符)都由QiwsirHandlers處理
]

注意

在這里我使用了r"/"的樣式,意味著就不需要使用轉(zhuǎn)義符,r后面的都表示該符號(hào)本來的含義。例如, ,如果單純這么來使用,就以為著換行,因?yàn)榉?hào)“”具有轉(zhuǎn)義功能(關(guān)于轉(zhuǎn)義詳細(xì)閱讀《玩轉(zhuǎn)字符串(1)》),當(dāng)寫成r" "的形式是,就不再表示換行了,而是兩個(gè)字符,和n,不會(huì)轉(zhuǎn)意。一般情況下,由于正則表達(dá)式和 會(huì)有沖突,因此,當(dāng)一個(gè)字符串使用了正則表達(dá)式后,最好在前面加上"r"。(關(guān)于正則表達(dá)式,看官姑且網(wǎng)上搜索,在后面的課程中,我也會(huì)介紹)

關(guān)于Application類的介紹,告一段落,但是并未完全講述了,因?yàn)檫€有別的參數(shù)設(shè)置沒有講,看官有興趣可以閱讀官方的文檔資料,地址是:http://tornado.readthedocs.org/en/latest/_modules/tornado/web.html#Application

HTTPServer類

實(shí)例化之后,Application對(duì)象(用app做為標(biāo)簽的)就可以被另外一個(gè)類HTTPServer引用,形式為:

http_server = tornado.httpserver.HTTPServer(app)

HTTPServer是tornado.httpserver里面定義的類。HTTPServer是一個(gè)單線程非阻塞HTTP服務(wù)器,執(zhí)行HTTPServer一般要回調(diào)Application對(duì)象,并提供發(fā)送響應(yīng)的接口,也就是下面的內(nèi)容是跟隨上面語句的(options.port的值在IndexHandler類前面通過from...import..設(shè)置的)。

http_server.listen(options.port)

這種方法,就建立了單進(jìn)程的http服務(wù)。

請(qǐng)看官牢記,如果在以后編碼中,遇到需要多進(jìn)程,請(qǐng)參考官方文檔說明:http://tornado.readthedocs.org/en/latest/httpserver.html#http-server

IOLoop類

剩下最后一句了:

tornado.ioloop.IOLoop.instance().start()

這句話,總是在__main()__的最后一句。表示可以接收來自HTTP的請(qǐng)求了。

以上把一個(gè)簡(jiǎn)單的hello.py剖析。想必讀者對(duì)Tornado編寫網(wǎng)站的基本概念已經(jīng)有了。


首頁???|???上一講:PYthon框架

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/37425.html

相關(guān)文章

  • [基礎(chǔ)學(xué)python]畫圈還不簡(jiǎn)單嗎?

    摘要:畫圈換一個(gè)說法就是循環(huán)。就相當(dāng)于讓依次等于中的各個(gè)值。例找出以內(nèi)的能夠被整除的正整數(shù)。以上做了簡(jiǎn)單分析,要實(shí)現(xiàn)流程,還需要細(xì)化一下。代碼代碼運(yùn)行結(jié)果這里僅僅列舉一個(gè)簡(jiǎn)單的例子,看官可以在這個(gè)例子基礎(chǔ)上深入打印某范圍內(nèi)的偶數(shù)奇數(shù)等。 畫圈?換一個(gè)說法就是循環(huán)。循環(huán),是高級(jí)語言編程中重要的工作。現(xiàn)實(shí)生活中,很多事情都是在循環(huán),日月更迭,斗轉(zhuǎn)星移,無不是循環(huán);王朝更迭,尋常百姓,也都是循環(huán)。...

    ccj659 評(píng)論0 收藏0
  • [基礎(chǔ)學(xué)python]探析get和post方法

    摘要:特別提醒,看官不要自宮,因?yàn)楸窘坛滩皇潜傩皠ψV,也不是葵花寶典,撰寫本課程的人更是生理健全者。直到目前,科學(xué)上尚未有證實(shí)或證偽自宮和寫程序之間是否存在某種因果關(guān)系。和是中用的最多的方法啦。 Do not store up for yourselves treasures on earth, where moth and rust consume and where thieves...

    AaronYuan 評(píng)論0 收藏0
  • [基礎(chǔ)學(xué)python]玩轉(zhuǎn)字符串(3)

    摘要:字符串是一個(gè)很長(zhǎng)的話題,縱然現(xiàn)在開始第三部分,但是也不能完全說盡。字符串就是一個(gè)話題中心。也就是和是指向同一個(gè)字符。字符串截取有了編號(hào),不僅僅能夠找出某個(gè)字符,還能在字符串中取出一部分來。 字符串是一個(gè)很長(zhǎng)的話題,縱然現(xiàn)在開始第三部分,但是也不能完全說盡。因?yàn)樽址亲匀徽Z言中最復(fù)雜的東西,也是承載功能最多的,計(jì)算機(jī)高級(jí)語言編程,要解決自然語言中的問題,讓自然語言中完成的事情在計(jì)算機(jī)上...

    Cc_2011 評(píng)論0 收藏0
  • 基礎(chǔ)如何學(xué)爬蟲技術(shù)

    摘要:楚江數(shù)據(jù)是專業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)服務(wù),現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲技術(shù)以供學(xué)習(xí),。本文來源知乎作者路人甲鏈接楚江數(shù)據(jù)提供網(wǎng)站數(shù)據(jù)采集和爬蟲軟件定制開發(fā)服務(wù),服務(wù)范圍涵蓋社交網(wǎng)絡(luò)電子商務(wù)分類信息學(xué)術(shù)研究等。 楚江數(shù)據(jù)是專業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)服務(wù),現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲技術(shù)以供學(xué)習(xí),http://www.chujiangdata.com。 第一:Python爬蟲學(xué)習(xí)系列教程(來源于某博主:htt...

    KunMinX 評(píng)論0 收藏0
  • [基礎(chǔ)學(xué)python]用Python計(jì)算

    摘要:一提到計(jì)算機(jī),當(dāng)然現(xiàn)在更多人把她叫做電腦,這兩個(gè)詞都是指。乃至于,有的人在口語中區(qū)分不開計(jì)算機(jī)和計(jì)算器。那么,做為零基礎(chǔ)學(xué)習(xí)這,也就從計(jì)算小學(xué)數(shù)學(xué)題目開始吧。因?yàn)閺倪@里開始,數(shù)學(xué)的基礎(chǔ)知識(shí)列為肯定過關(guān)了。 一提到計(jì)算機(jī),當(dāng)然現(xiàn)在更多人把她叫做電腦,這兩個(gè)詞都是指computer。不管什么,只要提到她,普遍都會(huì)想到她能夠比較快地做加減乘除,甚至乘方開方等。乃至于,有的人在口語中區(qū)分不開計(jì)...

    testbird 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<