最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python 搭建Web站點之Web服務器與Web框架

 更新時間:2016年11月06日 09:10:01   作者:selfboot  
這篇文章主要介紹了Python 搭建Web站點系列文章的第一篇,主要給大家簡單介紹Web服務器與Web框架的相關資料,需要的朋友可以參考下

之前用 Django 做過一個小的站點,感覺Django太過笨重,于是就準備換一個比較輕量級的 Web 框架來玩玩。Web.py 作者已經掛掉,項目好久沒有更新,所以不準備用它。而 Flask 也是一個成熟的輕量級 Web 框架,在 github 上有眾多的 Star 和 Fork,文檔和擴展也很豐富,值得學習。

學習一個框架最好的方式就是用框架做一個項目,在實戰(zhàn)中理解掌握框架。這里我用 Flask 框架,使用 Mysql 數(shù)據(jù)庫做了一個 論壇系統(tǒng) 。麻雀雖小,五臟俱全,論壇效果圖如下:

論壇系統(tǒng)截圖

下面是論壇的基本功能:

完整的用戶模塊(注冊、登錄,更改、找回密碼、信息修改、站內消息通知); 豐富的論壇模塊(創(chuàng)建、回復話題,站內搜索,markdown支持,@user 提醒); 強大的后臺管理,支持屏蔽用戶、話題、評論,支持各種條件搜索話題、評論;

本博客將會用一系列文章,記錄論壇系統(tǒng)搭建的過程,希望對剛入門Web開發(fā)的同學有所幫助。

我們經常聽說 Django, Flask 這些 python 語言的Web 框架,那么框架到底是什么,Web框架和Web服務器(Nginx, Apache等)有什么區(qū)別?離開框架還能用 Python 搭建Web站點嗎?要解決這些疑問,我們有必要來理解下 Web 服務器的工作原理,以及 Web 框架的本質。

Web 服務器

當我們在瀏覽器輸入URL后,瀏覽器會先請求 DNS服務器,獲得請求站點的 IP 地址 。然后發(fā)送一個HTTP Request(請求)給擁有該 IP 的主機,接著就會接收到服務器給我們的 HTTP Response(響應),瀏覽器經過渲染后,以一種較好的效果呈現(xiàn)給我們。這個過程中,正是Web服務器在幕后默默做貢獻。

簡單來說,Web服務器是在運行在物理服務器上的一個程序,它永久地等待客戶端(主要是瀏覽器,比如Chrome,F(xiàn)irefox等)發(fā)送請求。當收到請求之后,它會生成相應的響應并將其返回至客戶端。Web服務器通過HTTP協(xié)議與客戶端通信,因此也被稱為HTTP服務器。

Web 服務器

Web服務器的工作原理并不復雜,一般可分成如下4個步驟:建立連接、請求過程、應答過程以及關閉連接。

建立連接:客戶機通過TCP/IP協(xié)議建立到服務器的TCP連接。 請求過程:客戶端向服務器發(fā)送HTTP協(xié)議請求包,請求服務器里的資源文檔。 應答過程:服務器向客戶機發(fā)送HTTP協(xié)議應答包,如果請求的資源包含有動態(tài)語言的內容,那么服務器會調用動態(tài)語言的解釋引擎負責處理“動態(tài)內容”,并將處理得到的數(shù)據(jù)返回給客戶端。由客戶端解釋HTML文檔,在客戶端屏幕上渲染圖形結果。 關閉連接:客戶機與服務器斷開。

下面我們實現(xiàn)一個簡單的 Web 服務器。運行示例程序后,會監(jiān)聽本地端口 8000,在瀏覽器訪問 http://localhost:8000 就能看到響應內容。而我們的程序也能夠打印出客戶端發(fā)來的請求內容,如下圖:

簡單Web服務器

這里Request 和 Response 都需要遵守 HTTP 協(xié)議,關于 HTTP 協(xié)議的詳細內容,可以讀讀《HTTP 權威指南》,或者看我整理的HTTP 部分內容。

雖然說web服務器的主要工作是根據(jù)request返回response,但是實際中的 Web 服務器遠遠比上面示例的復雜的多,因為要考慮的因素實在是太多了,比如:

緩存機制:講一些經常被訪問的頁面緩存起來,提高響應速度; 安全:防止黑客的各種攻擊,比如 SYN Flood 攻擊; 并發(fā)處理:如何響應不同客戶端同時發(fā)起的請求; 日志:記錄訪問日至,方便做一些分析。

目前在UNIX和LINUX平臺下使用最廣泛的免費 Web 服務器有Apache和 Nginx 。

Web 應用程序

Web 服務器接受 Http Request,返回 Response,很多時候 Response 并不是靜態(tài)文件,因此需要有一個應用程序根據(jù) Request 生成相應的 Response。這里的應用程序主要用來處理相關業(yè)務邏輯,讀取或者更新數(shù)據(jù)庫,根據(jù)不同 Request 返回相應的 Response。注意這里并不是 Web 服務器本身來做這件事,它只負責 Http 協(xié)議層面和一些諸如并發(fā)處理,安全,日志等相關的事情。

應用程序可以用各種語言編寫(Java, PHP, Python, Ruby等),這個應用程序會從Web服務器接收客戶端的請求,處理完成后,再返回響應給Web服務器,最后由Web服務器返回給客戶端。整個架構如下:

Web應用程序

以 Python 為例,使用Python開發(fā)Web,最原始和直接的辦法是使用CGI標準,在1998年這種方式很流行。首先確保 Web 服務器支持CGI及已經配置了CGI的處理程序,然后設置好CGI目錄,在目錄里面添加相應的 python 文件,每一個 python 文件處理相應輸入,生成一個 html 文件即可,如下例:

# !/usr/bin/python 
# -*- coding: UTF-8 -*- 
print "Content-type:text/html" 
print # 空行,告訴服務器結束頭部 
print '<html>' 
print '<head>' 
print '<meta charset="utf-8">' 
print '</head>' 
print '<body>' 
print '<h2>Hello Word! 我是一個CGI程序</h2>' 
print '</body>' 
print '</html>' 

這樣在瀏覽器訪問該文件就可以得到一個簡單的 Hello World 網頁內容。直接通過 CGI 寫 Web 應用程序看起來很簡單,每一個文件處理輸入,生成html。但是實際開發(fā)中,可能會遇到許多不方便的地方。比如:

每個獨立的CGI腳本可能會重復寫數(shù)據(jù)庫連接,關閉的代碼; 后端開發(fā)者會看到一堆 Content-Type 等和自己無關的 html 頁面元素; Web 框架

早期開發(fā)站點確做了許多重復性勞動,后來為了減少重復,避免寫出龐雜,混亂的代碼,人們將 Web 開發(fā)的關鍵性過程提取出來,開發(fā)出了各種 Web 框架。有了框架,就可以專注于編寫清晰、易維護的代碼,無需關心數(shù)據(jù)庫連接之類的重復性工作。

其中一種比較經典的Web框架采用了 MVC 架構,如下圖所示:

MVC 架構

用戶輸入 URL,客戶端發(fā)送請求,控制器(Controller)首先會拿到請求,然后用模型(Models)從數(shù)據(jù)庫取出所有需要的數(shù)據(jù),進行必要的處理,將處理后的結果發(fā)送給 視圖(View),視圖利用獲取到的數(shù)據(jù),進行渲染生成 Html Response返回給客戶端。

以 python web 框架 flask 為例,框架本身并不限定我們用哪種架構來組織我們的應用,不過 flask 可以很好地支持以 MVC 方式組織應用。

控制器:flask 可以用裝飾器來添加路由項,如下:

@app.route('/') 
def main_page(): 
  pass 

模型:主要用來取出需要的數(shù)據(jù),如下面函數(shù)中操作:

@app.route('/') 
def main_page(): 
  """Searches the database for entries, then displays them.""" 
  db = get_db() 
  cur = db.execute('select * from entries order by id desc') 
  entries = cur.fetchall() 
  return render_template('index.html', entries=entries) 

視圖:flask 利用 jinja2 來渲染頁面,下面的模版文件指定了頁面的樣式:

{% for entry in entries %} 
<li> 
 <h2>{{ entry.title }}</h2> 
 <div>{{ entry.text|safe }}</div> 
</li> 
{% else %} 
<li><em>No entries yet. Add some!</em></li> 
{% endfor %} 

我們知道Python有著許多的 Web 框架,而同時又有著許多的 Web 服務器(Apache, Nginx, Gunicorn等),框架和Web服務器之間需要進行通信,如果在設計時它們之間不可以相互匹配的,那么選擇了一個框架就會限制對 Web 服務器的選擇,這顯然是不合理的。

那么,怎樣確??梢栽诓恍薷腤eb服務器代碼或網絡框架代碼的前提下,使用自己選擇的服務器,并且匹配多個不同的網絡框架呢?答案是接口,設計一套雙方都遵守的接口就可以了。對python來說,就是WSGI(Web Server Gateway Interface,Web服務器網關接口)。其他編程語言也擁有類似的接口:例如Java的Servlet API和Ruby的Rack。

Python WSGI的出現(xiàn),讓開發(fā)者可以將 Web 框架與 Web 服務器的選擇分隔開來,不再相互限制?,F(xiàn)在,你可以真正地將不同的 Web 服務器與Web框架進行混合搭配,選擇滿足自己需求的組合。例如,可以使用 Gunicorn 或Nginx/uWSGI來運行Django、Flask或web.py應用。

WSGI 適配

下一篇我們將會仔細分析 WSGI 接口標準,然后一起來寫一個簡單的 WSGI Web 服務器。

相關文章

  • Python中json格式數(shù)據(jù)的編碼與解碼方法詳解

    Python中json格式數(shù)據(jù)的編碼與解碼方法詳解

    這篇文章主要介紹了Python中json格式數(shù)據(jù)的編碼與解碼方法,詳細分析了Python針對json格式數(shù)據(jù)的編碼轉換操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • pandas進階教程之Dataframe的apply方法

    pandas進階教程之Dataframe的apply方法

    DataFrame中的apply方法就是將函數(shù)應用到由列或行形成的一維數(shù)組上,下面這篇文章主要給大家介紹了關于pandas進階教程之Dataframe的apply方法的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • Python有序字典簡單實現(xiàn)方法示例

    Python有序字典簡單實現(xiàn)方法示例

    這篇文章主要介紹了Python有序字典簡單實現(xiàn)方法,涉及Python使用OrderedDict方法進行字典排序的相關操作技巧,需要的朋友可以參考下
    2017-09-09
  • Python面向對象程序設計類的多態(tài)用法詳解

    Python面向對象程序設計類的多態(tài)用法詳解

    這篇文章主要介紹了Python面向對象程序設計類的多態(tài)用法,結合實例形式詳細分析了Python面向對象程序設計中類的多態(tài)概念、原理、用法及相關操作注意事項,需要的朋友可以參考下
    2019-04-04
  • Python Mock模塊原理及使用方法詳解

    Python Mock模塊原理及使用方法詳解

    這篇文章主要介紹了Python Mock模塊原理及使用方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • Python中os.system()、subprocess.run()、call()、check_output()的使用案例

    Python中os.system()、subprocess.run()、call()、check_output()的使用

    這篇文章主要介紹了Python中os.system()、subprocess.run()、call()、check_output()的使用案例,本文結合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • 利用Python學習RabbitMQ消息隊列

    利用Python學習RabbitMQ消息隊列

    RabbitMQ和郵局的主要區(qū)別就是RabbitMQ接收、存儲和發(fā)送的是二進制數(shù)據(jù)----消息,本篇文章給大家介紹利用Python學習RabbitMQ消息隊列,對python消息隊列相關知識感興趣的朋友參考下
    2015-11-11
  • python基于雙向鏈表實現(xiàn)LFU算法

    python基于雙向鏈表實現(xiàn)LFU算法

    這篇文章主要為大家詳細介紹了python基于雙向鏈表實現(xiàn)LFU算法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 詳解Python中with語句的用法

    詳解Python中with語句的用法

    這篇文章主要介紹了Python中with語句的用法,with語句的使用是Python學習過程當中的基礎知識,本文來自于IBM官方技術文檔,需要的朋友可以參考下
    2015-04-04
  • django文檔學習之applications使用詳解

    django文檔學習之applications使用詳解

    這篇文章主要介紹了Python文檔學習之applications使用詳解,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01

最新評論

界首市| 阜宁县| 新河县| 平乡县| 昭通市| 合水县| 台前县| 阿克苏市| 府谷县| 南康市| 察隅县| 阿鲁科尔沁旗| 彩票| 友谊县| 德安县| 陇川县| 清涧县| 苍梧县| 自治县| 舟曲县| 三江| 佛教| 娱乐| 康乐县| 拉萨市| 剑河县| 南江县| 周宁县| 定兴县| 阆中市| 长葛市| 闻喜县| 云阳县| 尚志市| 宜兰市| 营山县| 宝应县| 赫章县| 罗江县| 新密市| 陇南市|